home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / telecomm / bbs / bbbbs84.lha / rexx / BBBBS.baud < prev    next >
Encoding:
Text File  |  1994-12-21  |  149.4 KB  |  5,789 lines

  1. /*               $VER: BBBBS.baud 8.3 (21.12.94)
  2.  BBBBS.baud 8.3 © 1990-94 Richard Lee Stockton 21 Dec 94 1:56PM
  3.      - FREELY DISTRIBUTABLE AS LONG AS THIS NOTICE REMAINS -
  4.  
  5.      BBBBS.baud. A full-featured BBS in ARexx for Baudbandit
  6. based on 'Answer.baud'. Thanks to Greg Cunningham for BaudBandit!
  7.      See BBBBS.guide and rexx/bbsLOCAL.rexx for install info
  8. */
  9.  
  10. saypath='SYS:Utilities/Say'
  11.  
  12. /* If QuickSortPort not found then try to run setup.rexx */
  13.  
  14. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  15. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  16.  
  17. IF SHOW('P','BBBBS') THEN
  18.   DO
  19.     SAY 'BBBBS is already running!'
  20.     EXIT 0
  21.   END
  22.  
  23. CALL OPENPORT('BBBBS')
  24.  
  25. RESET:
  26. CALL SETCLIP('BBS_RESET')
  27. copyright.=''
  28. copyright.1=STRIP(SOURCELINE(2))
  29. copyright.2='
  30. Gramma Software 21305-60th Ave West, Mountlake Terrace WA 98043-2009'
  31. copyright.3='
  32. ARexx portions of this software copyright 1990-94 Richard Lee Stockton'
  33. copyright.4='- FREELY DISTRIBUTABLE as long as this notice remains -'
  34.  
  35. CALL SETCLIP('BBS_version',copyright.1)
  36. CALL SETCLIP('BBS_localfiles')
  37. CALL SETCLIP('BBS_localusers')
  38. CALL SETCLIP('BBS_interpret')
  39. CALL SETCLIP('BBS_FULLCALL')
  40. CALL SETCLIP('BBS_MESSAGE')
  41. CALL SETCLIP('BBS_BROWSE')
  42. CALL SETCLIP('BBS_MSGS')
  43. CALL SETCLIP('BBS_QUIT')
  44.  
  45. /* try to trap everything */
  46.  
  47. OPTIONS RESULTS
  48. OPTIONS FAILAT 999999
  49. NUMERIC DIGITS 14
  50. SIGNAL ON HALT
  51. SIGNAL ON SYNTAX
  52. SIGNAL ON FAILURE
  53. SIGNAL OFF BREAK_C
  54. SIGNAL OFF BREAK_E
  55.  
  56. PARSE VERSION . . cpu .
  57. cpu=RIGHT(cpu,2)/10
  58. IF cpu<1 THEN cpu=1
  59. Status Vers
  60. BB_VERS=RESULT
  61. bm=50
  62. IF RIGHT(BB_VERS,4)>1.59 THEN bm=25
  63. dcd
  64. IF RC=0 THEN Send 'ATH1\r'
  65.  
  66. bbsprefs.=0  /* start with all prefs OFF */
  67. namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
  68. alpha.=''
  69. logonflag=1
  70. emailonline=-1
  71. CALL zerovars()
  72.  
  73. /* User data structure by line */
  74.  
  75. text.=''
  76. text.1='   Full Name'
  77. text.2='      Street'
  78. text.3='City, ST Zip'
  79. text.4=' Voice Phone'
  80. text.5='    Password'
  81. text.6='    Protocol'
  82. text.7='LinesPerPage'
  83. text.8=' Preferences'
  84. text.9='    Computer'
  85. text.10='   Interests'
  86. text.11='Session Time'
  87. text.12='FirstSession'
  88. text.13='Last Session'
  89. text.14='      UpLoad'
  90. text.15='    Download'
  91. text.16='   Last File'
  92. text.17='Ratio  Email'
  93. text.18='    Winnings'
  94. text.19='       Usage'
  95. text.20='       Level'
  96. text.21='Exclude DIRS'
  97. text.22='   Msgs Read'
  98. text.23='   Msgs Writ'
  99. text.24=' Marked Msgs'
  100. text.25='Marked Files'
  101. text.26='QUICKexclude'
  102. text.27=' CBV numbers'
  103.  
  104.  
  105. name=''
  106. CR='0D'x
  107. LF='0A'x
  108. lineup='1B'x'M'
  109. lm='Loading Module...'lineup||CR
  110. SAY CR
  111. SAY CENTER(copyright.1,75)||CR
  112.  
  113. CALL PRAGMA('W','N')
  114. CALL config()
  115. IF bbsprefs.15~=0 THEN
  116.   CALL send2log('===== BBBBS started' DATE('W') DATE() TIME('C') '=====')
  117.  
  118. IF ~EXISTS(bbspath'Numbers/FirstLogon') THEN
  119.   ADDRESS COMMAND 'C:Date >'bbspath'Numbers/FirstLogon'
  120.  
  121. SAY CENTER(copyright.2,75)||CR
  122.  
  123. /* open printer? */
  124. IF bbsprefs.3 THEN
  125.   DO
  126.     IF ~OPEN(p,'PRT:','W') THEN
  127.       DO
  128.         CALL send2log('failed to open printer.')
  129.         bbsprefs.3=0
  130.       END
  131.   END
  132.  
  133. /* CALL PRAGMA('W','W')   <-- UN-COMMENT THIS LINE TO ENABLE REQUESTERS */
  134. CALL colors(1)
  135. Capture OFF
  136. Timeout 120
  137. SAY CENTER(copyright.3,75)||CR
  138.  
  139. excuses.=''
  140. courtesy=''
  141. courtesyflag=0
  142. SAY CENTER(copyright.4,75)||CR
  143. SAY CR
  144. SAY CR
  145. SAY CENTER('Setting up, please wait...',75)||CR
  146. SAY CR
  147.  
  148. msg.=''
  149. IF readopen(bbspath'Lists/Conferences') THEN
  150.   DO
  151.     DO i=1
  152.       line=READLN(f)
  153.       IF line='END' THEN BREAK
  154.       IF EOF(f) THEN BREAK
  155.       num=WORD(line,1)
  156.       IF DATATYPE(num,'W') THEN msg.num=WORD(line,2)
  157.     END
  158.     CALL CLOSE(f)
  159.   END
  160.  
  161. dirs.=''
  162. IF readopen(bbspath'Lists/Libraries') THEN
  163.   DO
  164.     DO i=1
  165.       line=READLN(f)
  166.       IF line='END' | EOF(f) THEN LEAVE i
  167.       num=WORD(line,1)
  168.       IF DATATYPE(num,'W') THEN dirs.num=STRIP(WORD(line,2))
  169.     END
  170.     CALL CLOSE(f)
  171.   END
  172.  
  173. users=0
  174. CALL sortuserlist()
  175.  
  176. SAY CR
  177. SAY '          The larger the BBS gets, the longer it takes to setup...'CR
  178. CALL loadfiles()
  179. dcd
  180. IF RC~=0 & bbsprefs.15>0 THEN
  181.   DO
  182.     SAY CR
  183.     SAY '      If it seems to take forever, ask the sysop to try' pen3'Resident'def 'mode.'CR
  184.   END
  185. SAY CR
  186. CALL set_grand()
  187. CALL loadalpha(1)
  188.  
  189. dcd
  190. IF RC=0 THEN
  191.   DO
  192.     logonflag=0
  193.     SIGNAL DONE
  194.   END
  195.  
  196. LOGON:
  197. CALL checkdcd()
  198. bps=0
  199. SetMark 'CONNECT'
  200. IF RC=1 THEN
  201.   DO
  202.     GetLine
  203.     connectline=RESULT
  204.     PARSE VAR connectline 'CONNECT'bps
  205.     CALL STRIP(bps)
  206.     DO i=3 WHILE DATATYPE(SUBSTR(bps,i,1),'N')
  207.     END
  208.     bps=LEFT(bps,i-1)
  209.   END
  210. IF bps<300 | bps>38400 THEN
  211.   DO
  212.     SetMark 'CARRIER'
  213.     IF RC=1 THEN
  214.       DO
  215.         GetLine
  216.         connectline=RESULT
  217.         PARSE VAR connectline 'CARRIER'bps
  218.         CALL STRIP(bps)
  219.       END
  220.     ELSE bps='000 '
  221.   END
  222. DO i=3 WHILE DATATYPE(SUBSTR(bps,i,1),'N')
  223. END
  224. bps=LEFT(bps,i-1)
  225. SIGNAL ON BREAK_C
  226. SIGNAL OFF BREAK_E
  227. REMOTE ON
  228. TimeOut 120
  229. IF bps<300 THEN bps=getbaudrate()
  230. IF bps<300 THEN SIGNAL DONE
  231. bps=bps%1
  232. IF logonflag=0 THEN
  233.   DO
  234.     logonflag=1
  235.     DO i=1 TO 7
  236.       SAY '  'CR
  237.     END
  238.     DO i=1 TO 4
  239.       SAY CENTER(copyright.i,75)||CR
  240.     END
  241.     CALL sound('LOGON')
  242.     CALL DELAY(150)
  243.     SAY CR
  244.     SAY CR
  245.     SAY CR
  246.   END
  247. colorflag=1
  248. CALL colors(1)
  249.  
  250. IF alpha.0='' THEN CALL loadalpha(1)
  251.  
  252. CALL TIME('R')
  253.  
  254. /** Identify (title) message */
  255. IF EXISTS(bbspath'BBS_TEXT/HELLO') THEN
  256.   DO
  257.     nonstop=1
  258.     CALL showtext(bbspath'BBS_TEXT/HELLO' 0)
  259.     nonstop=0
  260.   END
  261. SAY CR
  262.  
  263. SAY 'Running on' BB_VERS 'at' bps 'baud. ' TIME('C') DATE('W') DATE()||CR
  264. Stat 'Z'
  265. CALL checkdcd()
  266.  
  267. /* Ask for name */
  268. name=''
  269. courtesy=''
  270. Queue CR
  271. DO count=1 TO 3
  272.   name=getinput(1 0 'Please enter name: ')
  273.   name=cleanstring(1':'name)
  274.   IF name='NEW' THEN LEAVE count
  275.   IF name~='' THEN
  276.     DO
  277.       IF EXISTS(bbspath'Users/'name) THEN LEAVE count
  278.       IF EXISTS(bbspath'Morgue/'name'.lha') THEN
  279.         DO
  280.           SAY CR
  281.           SAY name 'used to be a member of this BBS.'CR
  282.           SAY 'If that is you, and you recall your password, you may resurrect yourself...'CR
  283.           IF getinput(1 1 'Resurrect' name'? (Ny) > ')='Y' THEN
  284.             DO
  285.               dd=WORD(STATEF(bbspath'Morgue/'name'.lha'),5)
  286.               dd=DATE(,dd,'I')
  287.               SAY 'Resurrecting a dead user.  Killed' dd '...'CR
  288.               ADDRESS COMMAND 'CD' bbspath'0A'x||'lha x Morgue/'name'.lha'
  289.               CALL DELETE(bbspath'Morgue/'name'.lha')
  290.               CALL send2log('RESURRECTED:' name 'who was killed' dd)
  291.               sortuserflag=1
  292.               CALL sound('NEW_USER')
  293.               LEAVE count
  294.             END
  295.         END
  296.       IF FIND(exclusion,name)>0 THEN
  297.         DO
  298.           SAY 'Sorry, that is a reserved name.'CR
  299.           name=''
  300.           ITERATE count
  301.         END
  302.       CALL loadcourtesy()
  303.       IF bbsprefs.7>0 | FIND(courtesy,name)>0 THEN
  304.         DO
  305.           SAY CR
  306.           SAY 'Welcome' name'!'CR
  307.           SAY 'You will be automatically validated after you enter your user info.'CR
  308.           SAY CR
  309.           LEAVE count
  310.         END
  311.     END
  312.   IF count<3 THEN
  313.     DO
  314.       IF STRIP(name)~='' THEN SAY name 'not found.  Please try again.'CR
  315.       SAY 'New Users enter NEW to apply for validation.'CR
  316.     END
  317. END
  318. IF count>3 THEN SIGNAL DONE
  319. CALL TIME('R')
  320. logontime=TIME('C')
  321. line=left(name,16,' ') 'logged in  at' time('C') date('W') date() 'at' bps 'baud'
  322. CALL send2log(line)
  323. CALL checkUser()
  324. x=GETCLIP('BBS_FULLCALL')
  325. CALL SETCLIP('BBS_FULLCALL')
  326. IF WORD(x,1)=name & level<sysoplevel THEN
  327.   DO
  328.     mins=TIME('M')-WORD(x,2)
  329.     IF mins<0 THEN mins=mins+1440
  330.     IF mins<bbsprefs.26 THEN
  331.       DO
  332.         SAY CR
  333.         SAY bak2'*** Please wait at least' bbsprefs.26 'minutes between calls ***'def||CR
  334.         SAY CR
  335.         CALL SETCLIP('BBS_FULLCALL',x)
  336.         SIGNAL LOGOUT2
  337.       END
  338.   END
  339. IF UPPER(WORD(data.12,3))~='BIRTHDAY:' THEN
  340.   DO
  341.     SAY CR
  342.     SAY 'Please help us out by entering the following information.'CR
  343.     CALL getbirth()
  344.     SAY '   Thank you!'CR
  345.   END
  346. prevcaller=''
  347. prevcaller=GETCLIP('BBS_lastcaller')
  348. IF prevcaller~='' THEN CALL SETCLIP('BBS_prevcaller',prevcaller)
  349. city=docity(data.3)
  350. CALL SETCLIP('BBS_lastcaller',name city'  'TIME('C') DATE())
  351. CALL SETCLIP('BBS_level',level)
  352. CALL postuser(0)
  353. Timeout maxidle         /* max idle time at prompts */
  354.  
  355. IF RIGHT(WORD(data.12,4),4)=RIGHT(DATE('S'),4) THEN
  356.   DO
  357.     arg=bbspath'BBS_TEXT/BIRTHDAY'
  358.     IF EXISTS(arg) THEN 
  359.       DO
  360.         SAY CR
  361.         CALL showtext(arg 1)
  362.       END
  363.     SAY CR
  364.     SAY '***  Happy Birthday,' pen3||data.1||def', and many more!  ***'CR
  365.   END
  366. SAY CR
  367.  
  368. /* Get current protocol */
  369. Status Trans
  370. protocol=STRIP(RESULT)
  371.  
  372. IF bbsLOGON.baud(name level)=1 THEN SIGNAL OUT
  373. CALL checkdcd()
  374. CALL sortlibraries()
  375. CALL sortconferences()
  376. IF FIND(data.8,'QUICK')>0 THEN
  377.   DO
  378.     logonflag=0
  379.     CALL do_quick(0)
  380.     logonflag=1
  381.   END
  382.  
  383. /*
  384. Opening Display after logon. Seen by all Users ONCE A DAY. It first
  385. looks for a unique yearly data (ie, WELCOME.0704), then daily data
  386. (ie, WELCOME.Fri), and then a simple, everyday 'WELCOME' datafile.
  387. */
  388.  
  389. CALL postfour('Logon Messages')
  390.  
  391. IF DATE('I')>lastondate THEN
  392.   DO
  393.     SAY CR
  394.     arg=bbspath'BBS_TEXT/WELCOME.'RIGHT(DATE('S'),4)
  395.     CALL showtext(arg 1)
  396.     SAY CR
  397.     arg=bbspath'BBS_TEXT/WELCOME.'LEFT(DATE('W'),3)
  398.     CALL showtext(arg 1)
  399.     SAY CR
  400.     arg=bbspath'BBS_TEXT/WELCOME'
  401.     CALL showtext(arg 1)
  402.  
  403. /*
  404. Looks for files in the format BAUD.baudrate, ie "BAUD.2400" will only
  405. be seen by users logging on at 2400 baud.
  406. */
  407.  
  408.     arg=bbspath'BBS_TEXT/BAUD.'bps
  409.     IF EXISTS(arg) THEN
  410.       DO
  411.         SAY CR
  412.         CALL showtext(arg 1)
  413.       END
  414.  
  415. /*
  416. Looks for files in the format  LEVEL.low-high, ie "LEVEL.50-80" will only
  417. be seen by users with a level >= 50 and <= 80.
  418. */
  419.  
  420.     levels.=''
  421.     IF FileList(bbspath'BBS_TEXT/LEVEL.*',levels)>0 THEN
  422.       DO
  423.         DO ui=1 TO levels.0
  424.           p=LASTPOS('.',levels.ui)
  425.           x=SUBSTR(levels.ui,p+1)
  426.           PARSE VAR x lo'-'hi .
  427.           IF ~DATATYPE(lo,'W') | ~DATATYPE(hi,'W') THEN ITERATE ui
  428.           IF lo>level | hi<level THEN ITERATE ui
  429.           DO
  430.             SAY CR
  431.             CALL showtext(levels.ui 1)
  432.           END
  433.         END
  434.       END
  435.  
  436. /*
  437. Looks for format UNTIL.YYYYMMDD ie, "UNTIL.19920514"
  438. Deletes any that are previous to "today"
  439. */
  440.  
  441.     untils.=''
  442.     IF FileList(bbspath'BBS_TEXT/UNTIL.*',untils)>0 THEN
  443.       DO
  444.         CALL QSORT(1,untils.0,untils)
  445.         DO ui=1 TO untils.0
  446.           IF RIGHT(untils.ui,8)<DATE('S') THEN CALL DELETE(untils.ui)
  447.           ELSE
  448.             DO
  449.               SAY CR
  450.               CALL showtext(untils.ui 1)
  451.             END
  452.         END
  453.       END
  454.     DROP levels. untils.
  455.   END
  456.  
  457. IF bbsprefs.1 & ~terseflag THEN
  458.   DO
  459.     IF doGrin()>3 THEN CALL waiting()
  460.     IF EXISTS(bbspath'rexxDoors/Moon.rexx') THEN CALL Moon.rexx()
  461.     IF EXISTS(bbspath'rexxDoors/Time.rexx') THEN CALL Time.rexx()
  462.     IF FIND(UPPER(SHOWLIST('A')),'TODAY')>0 THEN
  463.       DO
  464.         tf=scratch'/TODAY'
  465.         IF EXISTS(tf) THEN
  466.           DO
  467.             finfo=STATEF(tf)
  468.             IF WORD(finfo,5)~=DATE('I') THEN
  469.               ADDRESS COMMAND 'C:Today091 >'tf
  470.           END
  471.         ELSE ADDRESS COMMAND 'C:Today091 >'tf
  472.         CALL showtext(tf 0)
  473.       END
  474.     SAY CR
  475.   END
  476.  
  477. IF SHOWDIR(bbspath'Email/'name)~='' THEN CALL readmail(0)
  478. ELSE SAY 'Your mailbox is empty.'CR
  479. IF ~terseflag THEN
  480.   DO
  481.     IF level>sysoplevel THEN
  482.       DO
  483.         lstmail=WORD(data.17,3)
  484.         IF ~DATATYPE(lstmail,'W') THEN lstmail=0
  485.         IF countcheck('Numbers/LastMail' 0)>lstmail THEN
  486.           IF getinput(1 1 'Check Email? (Ny) > ')='Y' THEN CALL mailreport()
  487.         IF level<99 THEN
  488.           DO
  489.             SAY CR
  490.             CALL showtext(bbspath'Email/'sysop'/NEW_FILES' 1)
  491.           END
  492.         SAY CR
  493.         CALL showtext(bbspath'Lists/NEW_USERS' 1)
  494.         CALL showtext(bbspath'Lists/CBV_USERS' 1)
  495.       END
  496.     CALL logonstats()
  497.     CALL newinfo()
  498.   END
  499. CALL showmarked(1)
  500. CALL setdir(libpath||dirs.1)
  501. logonflag=0
  502.  
  503.  
  504. /***** MAIN *****/
  505.  
  506. IF menu~='ALL' THEN menu='MAIN'
  507.  
  508. RESTART:
  509. IF name='' | data.20='' | logonflag THEN SIGNAL LOGON  /* login was interrupted */
  510. SIGNAL ON BREAK_C
  511. SIGNAL ON BREAK_E
  512.  
  513. waitchar=''
  514. string=''
  515. opt=''
  516. IF level<1 THEN menu='NEW'
  517. DO WHILE(opt~='G')
  518.   go=0
  519.   uldlflag=0
  520.   DO WHILE(~go)
  521.     IF waitchar='' | waitchar='?' THEN
  522.       DO
  523.         commands='ceghiqrsvwxyz!#,'
  524.         IF level>0  THEN commands='abcdefghijlmnoprstuvwxyz!$#&+,.'
  525.         IF level>sysoplevel THEN commands=commands'k%^()=;'
  526.         IF level=99 THEN commands=commands'@~'
  527.         commands=commands'?'
  528.         IF menuflag | waitchar='?' | string='?' THEN CALL menus()
  529.         ELSE SAY pen3'COMMANDS:'def commands||CR
  530.         opt='MENU'
  531.         arg=''
  532.         CALL postuser(1)
  533.         IF level=0 THEN
  534.           IF SHOWDIR(bbspath'Email/'name)~='' THEN
  535.             DO
  536.               SAY 'You have new Email waiting! - Enter E to read your [E]mail'CR
  537.               SAY CR
  538.             END
  539.       END
  540.     CALL showtime()
  541.     line=''
  542.     line=line||bak2' 'TIME('C')' 'def
  543.     IF menu='ALL' | menu='FILE' THEN
  544.       line=line pen3'FILE_LIBRARY:'plaindir||def
  545.     ELSE IF menu='MSG' THEN line=line pen3'MESSAGES:'def
  546.     ELSE line=line pen3'MAIN:'def
  547.     line=line'  'bbsname
  548.     IF waitchar='' THEN waitchar=getinput(0 0 line' > ')
  549.     PARSE VAR waitchar string' 'arg
  550.     CALL checkdcd()
  551.     nonstop=0
  552.     string=UPPER(STRIP(string))
  553.     IF clr~='' THEN Send clr
  554.     IF POS('+++',string)>0 THEN SIGNAL OUT
  555.     IF string='OFF' | string='BYE' THEN SIGNAL LOGOUT2
  556.     IF string='FL' & level>0 THEN
  557.       DO
  558.         CALL bbsFriends.rexx(name colorflag)
  559.         string=''
  560.       END
  561.     CALL checkalias()
  562.     IF LEFT(string,1)='D' THEN
  563.       IF DATATYPE(SUBSTR(string,2),'W') THEN arg=SUBSTR(string,2) arg
  564.     waitchar=''
  565.     warnings=0
  566.     IF DATATYPE(string,'W') THEN
  567.       DO
  568.         IF string>level THEN
  569.           DO
  570.             arg=STRIP(string arg)
  571.             string='D'
  572.           END
  573.         ELSE
  574.           DO
  575.             dirnum=string
  576.             CALL chdir2()
  577.             CALL since()
  578.           END
  579.       END
  580.     IF string='QUICK' & level>0 THEN CALL do_quick(1)
  581.     opt=LEFT(string,1)
  582.     IF opt='G' THEN
  583.       DO
  584.         IF getinput(1 1 pen3'Logoff? (nY) > 'def)='N' THEN opt='?'
  585.       END
  586.     go=1    /* check for access */
  587.     t=bbspath'BBS_TEXT/COM.'opt
  588.     IF UPPER(arg)='EDIT' & level>sysoplevel THEN
  589.       DO
  590.         CALL edinfo(t,opt,'Menu Command')
  591.         opt=''
  592.       END
  593.     IF ~terseflag THEN CALL showtext(t 1)
  594.     IF POS(opt,UPPER(commands))=0 THEN go=0
  595.   END
  596.   IF CBVflag=1 THEN SIGNAL OUT
  597.   CALL postuser(1)
  598.   OPTIONS PROMPT 'Filename: '
  599.   SELECT
  600.     WHEN opt='A' THEN CALL showalpha()
  601.     WHEN opt='B' THEN CALL browse()
  602.     WHEN opt='C' THEN CALL editor(name maxtime-TRUNC(TIME('E')) 'MAIL' sysop . 0 0 'FEEDBACK')
  603.     WHEN opt='D' THEN CALL dload()
  604.     WHEN opt='E' THEN CALL readmail(level>0)
  605.     WHEN opt='F' THEN CALL do_F()
  606.     WHEN opt='H' THEN CALL help('MAIN')
  607.     WHEN opt='I' THEN CALL information()
  608.     WHEN opt='J' THEN CALL jump2rexx()
  609.     WHEN opt='K' THEN CALL killuser()
  610.     WHEN opt='L' THEN CALL list()
  611.     WHEN opt='M' THEN IF menu~='ALL' THEN menu='MSG'
  612.     WHEN opt='N' THEN CALL newfiles()
  613.     WHEN opt='O' THEN CALL otheruser()
  614.     WHEN opt='P' THEN CALL editor(name maxtime-TRUNC(TIME('E')) 'MSG' . . 0 0)
  615.     WHEN opt='R' THEN IF menu='NEW' THEN CALL CBV();ELSE CALL readmessages()
  616.     WHEN opt='S' THEN CALL bbsSEARCH()
  617.     WHEN opt='T' THEN CALL chpro()
  618.     WHEN opt='U' THEN CALL uload(1)
  619.     WHEN opt='V' THEN CALL showtext(bbspath'Usage/USER.LOG' 1)
  620.     WHEN opt='W' THEN CALL showuserlist()
  621.     WHEN opt='X' THEN CALL switchmenuflag()
  622.     WHEN opt='Y' THEN CALL edituser()
  623.     WHEN opt='Z' THEN CALL counts()
  624.     WHEN opt='~' THEN CALL sysED(1)
  625.     WHEN opt='!' THEN CALL yell()
  626.     WHEN opt='@' THEN CALL shell()
  627.     WHEN opt='#' THEN CALL switchcolors()
  628.     WHEN opt='$' THEN IF menu='ALL' THEN menu='MAIN'; ELSE menu='ALL'
  629.     WHEN opt='%' THEN CALL editnote()
  630.     WHEN opt='^' THEN CALL readlogs()
  631.     WHEN opt='&' THEN CALL bbsProfiles.rexx(name level sysoplevel linesperpage colorflag maxtime-TIME('E') bbspath)
  632.     WHEN opt='+' THEN CALL ext_dload()
  633.     WHEN opt='(' THEN CALL filereport()
  634.     WHEN opt=')' THEN CALL mailreport()
  635.     WHEN opt='=' THEN CALL levelreport()
  636.     WHEN opt=';' THEN CALL changename()
  637.     WHEN opt=',' THEN DO;CALL hourly();CALL waiting();END
  638.     WHEN opt='.' THEN IF menu~='ALL' THEN menu='MAIN'
  639.     WHEN opt='?' THEN IF menuflag THEN CALL help('MAIN')
  640.     OTHERWISE NOP
  641.   END
  642. END
  643. SIGNAL LOGOUT
  644. EXIT
  645.  
  646.  
  647.  
  648. /* FUNCTIONS */
  649.  
  650.  
  651. do_F:
  652. IF menu='FILE' | menu='ALL' THEN
  653.   DO
  654.     IF STORAGE()<(bbsprefs.15+100000) | GETCLIP('BBS_libs.0')~='' THEN
  655.       DO
  656.         SAY CR
  657.         SAY 'Sorry! Not enough memory left for background archiving.'CR
  658.         SAY 'Please try again in 10 minutes or so.'CR
  659.         SAY CR
  660.         RETURN
  661.       END
  662.     DO i=0 TO libs.0
  663.       CALL SETCLIP('BBS_libs.'i,libs.i)
  664.     END
  665.     IF Make_BrowseList.baud(name colorflag files.0)=0 THEN
  666.       DO
  667.         CALL send2log('Arc: Make_BrowseList.baud')
  668.         IF emailonline>=0 THEN emailonline=emailonline+1
  669.       END
  670.     DO i=0 TO libs.0
  671.       CALL SETCLIP('BBS_libs.'i)
  672.     END
  673.   END
  674. ELSE IF menu~='ALL' THEN menu='FILE'
  675. RETURN
  676.  
  677.  
  678. cleanstring:
  679. PARSE ARG nflag':'cstr
  680. IF nflag=1 THEN
  681.   DO
  682.     cstr=COMPRESS(cstr,"'`")
  683.     cstr=TRANSLATE(cstr,,namemask)
  684.     cstr=SPACE(cstr,1,'_')
  685.     RETURN cstr
  686.   END
  687. bot=XRANGE(,'1F'x)
  688. IF nflag=2 THEN bot=COMPRESS(bot,'1B'x)  /* ESC for ANSI */
  689. ELSE cstr=strip_ansi(cstr)
  690. top=XRANGE('7F'x)
  691. cstr=COMPRESS(cstr,bot||top)
  692. IF nflag=0 THEN cstr=STRIP(cstr)
  693. RETURN cstr
  694.  
  695.  
  696. showtext:
  697. PARSE ARG starg warg .
  698. IF EXISTS(starg) THEN
  699.   DO
  700.     CALL readlines(starg 1)
  701.     IF colorflag=0 THEN CALL strip_lynes()
  702.     CALL seelines(1)
  703.     IF warg THEN
  704.       DO
  705.         CALL waiting()
  706.         nonstop=0
  707.       END
  708.   END
  709. RETURN
  710.  
  711.  
  712. strip_lynes:
  713. DO i=1 TO lynes.0
  714.   lynes.i=strip_ansi(lynes.i)
  715. END
  716. RETURN
  717.  
  718.  
  719. strip_ansi:
  720. PARSE ARG aline 
  721. n=POS('1B'x,aline)
  722. DO WHILE n>0
  723.   DO k=2
  724.     IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
  725.       leave k
  726.   END
  727.   aline=DELSTR(aline,n,k+1)
  728.   n=POS('1B'x,aline)
  729. END
  730. RETURN aline
  731.  
  732.  
  733. doGrin:
  734. IF ~EXISTS(bbspath'rexxDoors/Grin_du_Jour.rexx') THEN RETURN 0
  735. CALL setdir(bbspath'rexxDoors')
  736. temp=Grin_du_Jour.rexx()
  737. SAY CR
  738. RETURN temp
  739.  
  740.  
  741. send2log:
  742. PARSE ARG sendline
  743. logfile=bbspath'Logs/log.'DATE('S')    /* daily logs */
  744. fl='W'
  745. IF EXISTS(logfile) THEN fl='A'
  746. IF ~OPEN('log',logfile,fl) THEN
  747.   DO
  748.     IF ~OPEN('log',logfile,fl) THEN
  749.       DO
  750.         SAY 'failed to open log file'
  751.         RETURN
  752.      END
  753.   END
  754. CALL WRITELN('log',sendline)
  755. CALL CLOSE('log')
  756. IF bbsprefs.3=1 THEN CALL WRITELN(p,sendline)
  757. RETURN
  758.  
  759.  
  760. send2last:
  761. PARSE ARG sendline 
  762. IF bbsprefs.24~=1 & name=sysop THEN RETURN
  763. ADDRESS AREXX bbsLog99.rexx 'USER' sendline
  764. RETURN
  765.  
  766.  
  767. do_quick:
  768. ARG flag .
  769. CALL postfour('QUICK:')
  770. IF FIND(UPPER(data.8),'QUICK')=0 THEN
  771.   DO
  772.     SAY CR
  773.     SAY 'The QUICK option is OFF in your current settings.'CR
  774.     SAY CR
  775.     SAY 'Setting the QUICK option to ON will allow you to tell the BBS to'CR
  776.     SAY 'make a .lha archive of all new bbs activity since your last call.'CR
  777.     SAY CR
  778.     SAY 'This archive can then be read (and replied to, and files can be'CR
  779.     SAY 'uploaded and downloaded) using 'pen3'bbsQUICK.rexx'def', the offline read/reply'CR
  780.     SAY 'module for BBBBS, which is available here in the file libraries.'CR
  781.     SAY CR
  782.     IF getinput(1 1 'Turn the QUICK option ON? (Ny) > ')~='Y' THEN RETURN
  783.     data.8=data.8 'QUICK'
  784.     CALL savedata(0)
  785.   END
  786. ELSE IF flag=1 THEN
  787.   DO
  788.     IF getinput(1 1 'Turn the QUICK option OFF? (Ny) > ')='Y' THEN
  789.       DO 
  790.         temp=data.8
  791.         data.8=''
  792.         DO i=1 TO WORDS(temp)
  793.           IF WORD(temp,i)~='QUICK' THEN data.8=STRIP(data.8 WORD(temp,i))
  794.         END
  795.         ADDRESS COMMAND 'c:delete' bbspath'EmailFiles/'name'/QUICK_#?'
  796.         RETURN
  797.       END
  798.   END
  799. IF getinput(1 1 'Edit your QUICK exclude list? (Ny) > ')='Y' THEN
  800.   DO
  801.     SAY CR
  802.     SAY 'You may EXCLUDE any of these from your QUICK archives.'CR
  803.     SAY pen3||LEFT('-',74,'-')||def||CR
  804.     temp=LEFT(' ',7)
  805.     SAY temp'HELLO          - Pre-logon message.'CR
  806.     SAY temp'WELCOME        - Post-logon message.'CR
  807.     SAY temp'GOODBYE        - Logoff message.'CR
  808.     SAY temp'HOURLY         - Average-Minutes-Per-Hour usage graph.'CR
  809.     SAY temp'STATS.BBS      - Most of the Z command from the main menu.'CR
  810.     SAY temp'filename       - ANY filename in the Information area.'CR
  811.     SAY temp'MESSAGES       - New conference messages.'CR
  812.     SAY temp'FILELIST       - New file descriptions.'CR
  813.     SAY pen3||LEFT('-',74,'-')||def||CR
  814.     SAY 'Enter a space separated list of what you wish to exclude.'CR
  815.     SAY pen3'Exclude:'def data.26||CR
  816.     temp=getinput(1 0 pen3'Exclude: 'def)
  817.     IF temp='' & data.26~='' THEN
  818.       DO
  819.         IF getinput(1 1 'Clear the QUICK exclude list? (nY) > ')~='N' THEN
  820.           data.26=''
  821.       END
  822.     ELSE data.26=temp
  823.     temp='Your QUICK archives will exclude'pen3
  824.     IF data.26='' THEN temp=temp 'nothing!'
  825.     ELSE temp=temp data.26
  826.     SAY temp||def||CR
  827.     CALL savedata(0)
  828.     SAY CR
  829.   END
  830. IF GETCLIP('BBS_'name)~='' THEN
  831.   DO
  832.     SAY CR
  833.     SAY 'The QUICK routines are still working on your archive...'CR
  834.     SAY 'Please try again later.'CR
  835.     SAY CR
  836.     RETURN
  837.   END
  838. quickdir=bbspath'EmailFiles/'name
  839. CALL MAKEDIR(quickdir)
  840. CALL setdir(quickdir)
  841. qdarg=scratch'/dirlist'
  842. ADDRESS COMMAND 'C:list >'qdarg quickdir'/QUICK_#? DATES'
  843. efiles=UPPER(SHOWDIR(quickdir))
  844. qflag=0
  845. das=0
  846. IF getinput(1 1 'Archive new BBS activity now? (Ny) > ')='Y' THEN
  847.   DO
  848.     das=1
  849.     DO i=1 TO WORDS(efiles)
  850.       IF LEFT(WORD(efiles,i),6)='QUICK_' & RIGHT(qarg,4)='.LHA' THEN
  851.         DO
  852.           SAY CR
  853.           SAY 'There is already a QUICK_xxxxx.LHA file in your mailbox...'CR
  854.           SAY 'Activity request has been CANCELLED!'CR
  855.           SAY CR
  856.           das=0
  857.           LEAVE i
  858.         END
  859.     END
  860.   END
  861. IF das=1 THEN
  862.   DO
  863.     CALL SETCLIP('BBS_city',city)
  864.     CALL SETCLIP('BBS_'name'_26',data.26)
  865.     IF FIND(UPPER(data.26),'STATS.BBS')=0 THEN
  866.       CALL SETCLIP('BBS_statsarg',emailonline grand grand2 files.0)
  867.     IF FIND(UPPER(data.26),'MESSAGES')=0 THEN
  868.       CALL SETCLIP('BBS_'name'_22',data.22)
  869.     CALL MAKEDIR(bbspath'EmailFiles/'name)
  870.     CALL showmarked(0)
  871.     CALL SETCLIP('BBS_QUICKOUT_BAUD',bps)
  872.     ADDRESS AREXX bbsQUICKOUT.rexx name level lastbrowse WORD(data.16,2) data.21
  873.     CALL send2log('Started QUICKOUT at' TIME('C'))
  874.     SAY CR
  875.     IF FIND(UPPER(data.26),'MESSAGES')=0 THEN
  876.       DO
  877.         clear_marked=1
  878.         DO i=1 TO level
  879.           IF WORD(data.22,i)~=-1 THEN
  880.             lastread.i=countcheck('Numbers/LastMessage'i 0)
  881.         END
  882.         SAY CR
  883.       END
  884.     IF FIND(UPPER(data.26),'FILELIST')=0 THEN
  885.       lastbrowse=countcheck('Numbers/LastFile' 0)
  886.     newfilesdate=DATE('S') TIME()
  887.     IF writeopen(bbspath'EmailFiles/'name'/Libraries') THEN
  888.       DO
  889.         DO i=1 TO libs.0
  890.           CALL WRITELN(f,libs.i)
  891.         END
  892.         CALL CLOSE(f)
  893.       END
  894.     IF writeopen(bbspath'EmailFiles/'name'/Conferences') THEN
  895.       DO
  896.         DO i=1 TO msgs.0
  897.           CALL WRITELN(f,msgs.i)
  898.         END
  899.         CALL CLOSE(f)
  900.       END
  901.     SAY CR
  902.     CALL savedata(1)
  903.     qflag=1
  904.   END
  905. IF WORD(STATEF(qdarg),2)>80 THEN
  906.   DO
  907.     CALL showtext(qdarg 0)
  908.     SAY CR
  909.   END
  910. DO qi=1 TO WORDS(efiles)
  911.   qarg=WORD(efiles,qi)
  912.   IF LEFT(qarg,6)='QUICK_' & RIGHT(qarg,4)='.LHA' THEN
  913.     DO
  914.       SAY qarg 'is' WORD(STATEF(qarg),2) 'bytes.'CR
  915.       allargs=qarg
  916.       DO WHILE dload2()=1
  917.       END
  918.       t=''
  919.       DO WHILE t~='N' & t~='Y'
  920.         t=getinput(1 1 'Delete' qarg'? (ny) > ')
  921.       END
  922.       IF t='Y' THEN
  923.         DO
  924.           IF DELETE(quickdir'/'qarg)=1 THEN SAY qarg 'deleted.'CR
  925.           CALL DELETE(quickdir'/'qarg'.xdl')
  926.           qarg=COMPRESS(UPPER(qarg),'QUICK_.LHA')
  927.           CALL DELETE(bbspath'Email/'name'/BBBBS.'qarg)
  928.         END
  929.     END
  930. END
  931. arg=''
  932. IF getinput(1 1 'Do you have a QUICKIN file to upload? (Ny) > ')='Y' THEN
  933.   DO
  934.     arg='QUICKIN.lha'
  935.     ul=2
  936.     DO WHILE ul=2
  937.       ul=uload(0)
  938.     END
  939.   END
  940. IF EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') & level>=sysoplevel THEN
  941.   IF getinput(1 1 'Process your QUICKIN archive [N]ow or at [L]ogoff? (Ln) > ')='N' THEN
  942.     DO
  943.       ADDRESS AREXX bbsQUICKIN.rexx name level sysoplevel bbsprefs.6
  944.       SAY CR
  945.       SAY 'Processing QUICKIN archive...'CR
  946.     END
  947. IF getinput(1 1 'Logoff Now? (nY) > ')~='N' THEN
  948.   DO
  949.     IF qflag THEN SAY 'Your archive will be waiting next time you call...'CR
  950.     SAY CR
  951.     SIGNAL LOGOUT2
  952.   END
  953. IF qflag THEN
  954.   DO
  955.     SAY CR
  956.     SAY 'Note: You now have no ''new'' files or messages (they are being archived).'CR
  957.     SAY CR
  958.     SAY 'You will be signaled if you are still online when your archive is ready...'CR
  959.     SAY CR
  960.     CALL waiting()
  961.   END
  962. CALL setdir(libpath||dirs.1)
  963. RETURN
  964.  
  965.  
  966. killuser:
  967. ARG kname .
  968. IF level<=sysoplevel THEN RETURN
  969. CALL bbsKillUser.rexx(kname)
  970. RETURN
  971.  
  972.  
  973. menus:
  974. CALL checkdcd()
  975. IF OPEN(f,bbspath'BBS_TEXT/MENU_'menu'.'colorflag,'R')~=0 THEN
  976.   DO
  977.     m=READCH(f,65000)
  978.     CALL CLOSE(f)
  979.     SAY m
  980.     IF level>sysoplevel THEN
  981.       DO
  982.         SAY ' ['pen3'K'def']ill a user      ['pen3'%'def'] edit filenote  ['pen3'='def'] level report'def||CR
  983.         SAY ' ['pen3'^'def'] view BBS logs  ['pen3'('def'] file report    ['pen3';'def'] change username'def||CR
  984.       END
  985.     IF level=99 THEN
  986.       SAY ' ['pen3'~'def'] online editor  ['pen3'@'def'] dos shell      ['pen3')'def'] email report'def||CR
  987.   END
  988. ELSE IF menu='NEW' THEN
  989.   DO
  990.     SAY pen6'     _________________'def||CR
  991.     SAY pen6'  __/  'pen3'New User Menu'pen6'  \___'def||CR
  992.     SAY pen6' |                        |'def||CR
  993.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  994.     SAY pen6' |'def'   ['pen3'I'def']nformation        'pen6'|'def||CR
  995.     SAY pen6' |'def'   ['pen3'Y'def']our user data     'pen6'|'def||CR
  996.     SAY pen6' |'def'   ['pen3'W'def']ho is here        'pen6'|'def||CR
  997.     SAY pen6' |'def'   ['pen3'S'def']earch user list   'pen6'|'def||CR
  998.     SAY pen6' |'def'   ['pen3'V'def']iew user log      'pen6'|'def||CR
  999.     SAY pen6' |'def'   ['pen3'Z'def'] bbs statistics   'pen6'|'def||CR
  1000.     SAY pen6' |'def'   ['pen3','def'] hourly stats     'pen6'|'def||CR
  1001.     SAY pen6' |'def'   ['pen3'X'def'] toggle menus     'pen6'|'def||CR
  1002.     SAY pen6' |'def'   ['pen3'#'def'] toggle color     'pen6'|'def||CR
  1003.     SAY pen6' |'def'   ['pen3'!'def'] YELL for SYSOP   'pen6'|'def||CR
  1004.     SAY pen6' |'def'   ['pen3'C'def']omment to SYSOP   'pen6'|'def||CR
  1005.     SAY pen6' |'def'   ['pen3'G'def']oodbye (hangup)   'pen6'|'def||CR
  1006.     SAY pen6' |________________________|'def||CR
  1007.     IF bbsprefs.22~=0 THEN
  1008.       DO
  1009.         SAY CR
  1010.         SAY 'Local Callers may register and receive' pen7'INSTANT VALIDATION'def'!'CR
  1011.         SAY 'Enter R to ['pen3'R'def']egister using Call Back Verify.'CR
  1012.       END
  1013.   END
  1014. ELSE IF menu='MSG' THEN
  1015.   DO
  1016.     SAY pen6'       ____________'def||CR
  1017.     SAY pen6'  ____/  'pen3'Messages'pen6'  \_____'def||CR
  1018.     SAY pen6' |                       |'def||CR
  1019.     SAY pen6' |'def'   ['pen3'H'def']elp              'pen6'|'def||CR
  1020.     SAY pen6' |'def'   ['pen3'P'def']ost messages     'pen6'|'def||CR
  1021.     SAY pen6' |'def'   ['pen3'R'def']ead messages     'pen6'|'def||CR
  1022.     SAY pen6' |'def'   ['pen3'S'def']earch messages   'pen6'|'def||CR
  1023.     SAY pen6' |'def'   ['pen3'E'def']mail (private)   'pen6'|'def||CR
  1024.     SAY pen6' |'def'   ['pen3'C'def']omment to SYSOP  'pen6'|'def||CR
  1025.     SAY pen6' |'def'   ['pen3'QUICK'def'] options     'pen6'|'def||CR
  1026.     SAY pen6' |'def'   ['pen3'FL'def'] Friends List   'pen6'|'def||CR
  1027.     SAY pen6' |'def'   ['pen3'!'def'] YELL for SYSOP  'pen6'|'def||CR
  1028. IF(level>sysoplevel) THEN DO
  1029.     SAY pen6' |'def'   ['pen3'^'def'] view BBS logs   'pen6'|'def||CR
  1030.     SAY pen6' |'def'   ['pen3')'def'] email report    'pen6'|'def||CR
  1031.     SAY pen6' |'def'   ['pen3'='def'] level report    'pen6'|'def||CR
  1032.     SAY pen6' |'def'   ['pen3';'def'] change username 'pen6'|'def||CR;END
  1033. IF(level=99) THEN DO
  1034.     SAY pen6' |'def'   ['pen3'~'def'] online editor   'pen6'|'def||CR
  1035.     SAY pen6' |'def'   ['pen3'@'def'] dos shell       'pen6'|'def||CR;END
  1036.     SAY pen6' |'def'   ['pen3'F'def']iles menu        'pen6'|'def||CR
  1037.     SAY pen6' |'def'   ['pen3'.'def'] main menu       'pen6'|'def||CR
  1038.     SAY pen6' |_______________________|'def||CR
  1039.   END
  1040. ELSE IF menu='FILE' THEN
  1041.   DO
  1042.     SAY pen6'         _________'def||CR
  1043.     SAY pen6'  ______/  'pen3'Files'pen6'  \_______'def||CR
  1044.     SAY pen6' |                        |'def||CR
  1045.     SAY pen6' |'def'   ['pen3'A'def']lphabetic list    'pen6'|'def||CR
  1046.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  1047.     SAY pen6' |'def'   ['pen3'B'def']rowse filenotes   'pen6'|'def||CR
  1048.     SAY pen6' |'def'   ['pen3'N'def']ew files list     'pen6'|'def||CR
  1049.     SAY pen6' |'def'   ['pen3'L'def']ist by Library    'pen6'|'def||CR
  1050.     SAY pen6' |'def'   ['pen3'F'def']ilelist archives  'pen6'|'def||CR
  1051.     SAY pen6' |'def'   ['pen3'S'def']earch files       'pen6'|'def||CR
  1052.     SAY pen6' |'def'   ['pen3'U'def']pload             'pen6'|'def||CR
  1053.     SAY pen6' |'def'   ['pen3'D'def']ownload           'pen6'|'def||CR
  1054.     SAY pen6' |'def'   ['pen3'T'def']ransfer protocol  'pen6'|'def||CR
  1055.     SAY pen6' |'def'   ['pen3'+'def'] Extra Devices    'pen6'|'def||CR
  1056. IF(level>sysoplevel) THEN DO
  1057.     SAY pen6' |'def'   ['pen3'K'def']ill a user        'pen6'|'def||CR
  1058.     SAY pen6' |'def'   ['pen3'%'def'] edit filenote    'pen6'|'def||CR
  1059.     SAY pen6' |'def'   ['pen3'('def'] file report      'pen6'|'def||CR
  1060.     SAY pen6' |'def'   ['pen3';'def'] change username  'pen6'|'def||CR;END
  1061. IF(level=99) THEN DO
  1062.     SAY pen6' |'def'   ['pen3'@'def'] dos shell        'pen6'|'def||CR;END
  1063.     SAY pen6' |'def'   ['pen3'M'def']essages menu      'pen6'|'def||CR
  1064.     SAY pen6' |'def'   ['pen3'.'def'] main menu        'pen6'|'def||CR
  1065.     SAY pen6' |________________________|'def||CR
  1066.   END
  1067. ELSE IF menu='MAIN' THEN
  1068.   DO
  1069.     SAY pen6'       _____________'def||CR
  1070.     SAY pen6'  ____/  'pen3'Main Menu'pen6'  \_____'def||CR
  1071.     SAY pen6' |                        |'def||CR
  1072.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  1073.     SAY pen6' |'def'   ['pen3'I'def']nfomation         'pen6'|'def||CR
  1074.     SAY pen6' |'def'   ['pen3'J'def']ump to doorways   'pen6'|'def||CR
  1075.     SAY pen6' |'def'   ['pen3'Y'def']our user data     'pen6'|'def||CR
  1076.     SAY pen6' |'def'   ['pen3'W'def']ho is here list   'pen6'|'def||CR
  1077.     SAY pen6' |'def'   ['pen3'S'def']earch userlist    'pen6'|'def||CR
  1078.     SAY pen6' |'def'   ['pen3'O'def']ther users info   'pen6'|'def||CR
  1079.     SAY pen6' |'def'   ['pen3'V'def']iew user log      'pen6'|'def||CR
  1080.     SAY pen6' |'def'   ['pen3'X'def']pert (no menus)   'pen6'|'def||CR
  1081.     SAY pen6' |'def'   ['pen3'#'def'] toggle colors    'pen6'|'def||CR
  1082.     SAY pen6' |'def'   ['pen3'$'def'] toggle menu(s)   'pen6'|'def||CR
  1083.     SAY pen6' |'def'   ['pen3'&'def'] user profiles    'pen6'|'def||CR
  1084.     SAY pen6' |'def'   ['pen3'Z'def'] bbs statistics   'pen6'|'def||CR
  1085.     SAY pen6' |'def'   ['pen3','def'] hourly stats     'pen6'|'def||CR
  1086.     SAY pen6' |'def'   ['pen3'G'def']oodbye (hangup)   'pen6'|'def||CR
  1087.     SAY pen6' |'def'   ['pen3'F'def']iles menu         'pen6'|'def||CR
  1088.     SAY pen6' |'def'   ['pen3'M'def']essages menu      'pen6'|'def||CR
  1089.     SAY pen6' |________________________|'def||CR
  1090.   END
  1091. ELSE IF menu='ALL' THEN
  1092.   DO
  1093.     SAY pen6'     __________________________________________________________'def||CR
  1094.     SAY pen6'  __/   'pen3'Main Menu            File Menu          Message Menu 'pen6'  \__'def||CR
  1095.     SAY pen6' |                                                                |'def||CR
  1096.     SAY pen6' |'def' ['pen3'H'def']elp               ['pen3'A'def']lphabetical list  ['pen3'P'def']ost messages      'pen6'|'def||CR
  1097.     SAY pen6' |'def' ['pen3'I'def']nformation        ['pen3'B'def']rowse filenotes   ['pen3'R'def']ead messages      'pen6'|'def||CR
  1098.     SAY pen6' |'def' ['pen3'Z'def'] bbs statiZtics   ['pen3'L'def']ist by Library    ['pen3'E'def']mail (private)    'pen6'|'def||CR
  1099.     SAY pen6' |'def' ['pen3'Y'def']our user data     ['pen3'N'def']ew files          ['pen3'C'def']omment to SYSOP   'pen6'|'def||CR
  1100.     SAY pen6' |'def' ['pen3'O'def']ther users info   ['pen3'F'def']ilelist archiver  ['pen3'!'def'] YELL for SYSOP   'pen6'|'def||CR
  1101.     SAY pen6' |'def' ['pen3'J'def']ump to doorways   ['pen3'+'def'] Extra Devices    ['pen3'X'def']pert (no menus)   'pen6'|'def||CR
  1102.     SAY pen6' |'def' ['pen3'S'def']earch menu        ['pen3'D'def']ownload           ['pen3'$'def'] toggle menu(s)   'pen6'|'def||CR
  1103.     SAY pen6' |'def' ['pen3'&'def'] user profiles    ['pen3'U'def']pload             ['pen3'#'def'] toggle colors    'pen6'|'def||CR
  1104.     SAY pen6' |'def' ['pen3'V'def']iew user log      ['pen3'T'def']ransfer protocol  ['pen3','def'] hourly stats     'pen6'|'def||CR
  1105.     SAY pen6' |'def' ['pen3'G'def']oodbye (logoff)   ['pen3'QUICK'def'] options      ['pen3'FL'def'] Friends List    'pen6'|'def||CR
  1106. IF(level>sysoplevel) THEN DO
  1107.     SAY pen6' |'def' ['pen3'K'def']ill a user        ['pen3'%'def'] edit filenote    ['pen3'='def'] level report     'pen6'|'def||CR
  1108.     SAY pen6' |'def' ['pen3'^'def'] view BBS logs    ['pen3'('def'] file report      ['pen3';'def'] change username  'pen6'|'def||CR;END
  1109. IF(level=99) THEN
  1110.     SAY pen6' |'def' ['pen3'~'def'] online editor    ['pen3'@'def'] dos shell        ['pen3')'def'] email report     'pen6'|'def||CR
  1111.     SAY pen6' |________________________________________________________________|'def||CR
  1112.   END
  1113. QUEUE CR  /* clears any un-CRed input in the queue */
  1114. RETURN
  1115.  
  1116.  
  1117. help:
  1118. ARG helppath .
  1119. SAY CR
  1120. SAY 'For more detailed help, use ['pen3'I'def']nformation commmand to read BBBBS.COMMANDS.'CR
  1121. IF helppath='MAIN' THEN
  1122.   SAY 'Commands available from the' pen3||menu||def 'menu:'CR
  1123. frontend=bbspath'BBS_HELP/'helppath
  1124. backend='.USER'
  1125. IF level=0 THEN backend='.NEW'
  1126. ELSE IF level=99 THEN backend='.SUPER'
  1127. ELSE IF level>sysoplevel THEN backend='.SYSOP'
  1128. CALL showtext(frontend||backend 1)
  1129. RETURN
  1130.  
  1131.  
  1132. waiting:
  1133. CALL checktime()
  1134. IF waitchar='Q' THEN
  1135.   DO
  1136.     waitchar=''
  1137.     RETURN
  1138.   END
  1139. waitchar=''
  1140. IF nonstop=1 THEN RETURN
  1141. OPTIONS PROMPT pen3'                          RETURN=Continue 'def
  1142. PULL waitchar
  1143. CALL cleanline(1)
  1144. CALL checkdcd()
  1145. RETURN
  1146.  
  1147.  
  1148. waiting2:
  1149. CALL checktime()
  1150. IF nonstop=1 THEN RETURN 0
  1151. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  1152. IF waitchar='N' THEN
  1153.   DO
  1154.     nonstop=1
  1155.     SAY lineup||pen3'To EXIT non-stop scrolling of text, press CTRL-E        'def||CR
  1156.     SAY CR
  1157.     CALL DELAY(99)
  1158.     waitchar=''
  1159.   END
  1160. CALL cleanline(1)
  1161. CALL checkdcd()
  1162. IF waitchar='Q' THEN RETURN 1
  1163. RETURN 0
  1164.  
  1165.  
  1166. busywait:
  1167. ARG bii bi bt 
  1168. IF bii>4 & bi//(10*bii)=0 THEN CALL checkdcd()
  1169. IF bbsprefs.21=0 THEN RETURN
  1170. IF bi<1 THEN
  1171.   DO
  1172.     CALL WRITECH(STDOUT,'080808'x)
  1173.     IF ni<1 & i>999998 & wi>999998 THEN SAY CR
  1174.     RETURN
  1175.   END
  1176. IF bi=1 THEN CALL WRITECH(STDOUT,'   ')
  1177. IF bi//(bii%2)~=0 THEN RETURN
  1178. b=bi//bii
  1179. IF b=0 | b=bii%2 THEN
  1180.   DO
  1181.     tp=RIGHT((bi*100)%bt,2)'%'
  1182.     CALL WRITECH(STDOUT,'080808'x||tp)
  1183.   END
  1184. RETURN
  1185.  
  1186.  
  1187. cleanline:
  1188. ARG lflag .
  1189. IF nonstop=0 & clr~='' THEN
  1190.   DO
  1191.     Send clr
  1192.     RETURN
  1193.   END
  1194. cline=lineup||LEFT(' ',78)
  1195. IF lflag=1 THEN cline=cline||lineup
  1196. SAY cline||CR
  1197. RETURN
  1198.  
  1199.  
  1200. getinput:
  1201. PARSE ARG upflag' 'oneflag' 'pline
  1202. CALL checkdcd()
  1203. OPTIONS PROMPT pline
  1204. PARSE PULL inarg
  1205. inarg=STRIP(inarg)
  1206. IF upflag THEN inarg=UPPER(inarg)
  1207. IF oneflag THEN inarg=LEFT(inarg,1)
  1208. inarg=cleanstring(0':'inarg)
  1209. RETURN inarg
  1210.  
  1211.  
  1212. docity:
  1213. PARSE ARG citi
  1214. citi=TRANSLATE(citi,'          ','+-.,*/()<>')
  1215. DO i=WORDS(citi) TO 1 BY -1
  1216.   IF DATATYPE(WORD(citi,i),'N') THEN citi=STRIP(DELWORD(citi,i,1))
  1217.   IF UPPER(WORD(citi,i))='USA' THEN citi=STRIP(DELWORD(citi,i,1))
  1218. END
  1219. citi=SPACE(citi,1)
  1220. RETURN STRIP(citi)
  1221.  
  1222.  
  1223. postuser:
  1224. IF bbsprefs.12~=1 | ~SHOW('P','BBSPOST') THEN RETURN
  1225. ARG upflag .
  1226. IF upflag=6 THEN ptext='Logoff:' DATE() TIME('C')'  'name city
  1227. ELSE IF upflag=7 THEN ptext=name'  is a NEW USER!'
  1228. ELSE ptext='LogOn:' logontime'  'name city'  Last On:' DATE(,lastondate,'I')
  1229. ptext=CENTER(ptext,74)
  1230. CALL SETCLIP('BBSPOST1',ptext)
  1231. age='?'
  1232. IF UPPER(WORD(data.12,3))='BIRTHDAY:' THEN
  1233.   DO
  1234.     IF DATATYPE(WORD(data.12,4),'W') THEN
  1235.       DO
  1236.         age=LEFT(DATE('S'),4)-LEFT(WORD(data.12,4),4)
  1237.         IF SUBSTR(DATE('S'),5,2)<SUBSTR(WORD(data.12,4),5,2) THEN age=age-1
  1238.       END
  1239.   END
  1240. IF age='?' & WORD(data.12,4)~='' THEN age=WORD(data.12,4)
  1241. ptext=CENTER('Baud:' bps'   Age:' age'   Usage:' data.19,74)
  1242. CALL SETCLIP('BBSPOST2',ptext)
  1243. ptext2=''
  1244. ptext1=data.1'   '
  1245. IF DATATYPE(WORD(data.12,1),'W') THEN
  1246.   ptext2=ptext2'   First On:' DATE(,WORD(data.12,1),'S')
  1247. n=74-LENGTH(ptext1)-LENGTH(ptext2)
  1248. ptext2=ptext1||STRIP(LEFT(data.9,n))||ptext2
  1249. ptext2=CENTER(ptext2,74)
  1250. CALL SETCLIP('BBSPOST3',ptext2)
  1251. ulb=WORD(data.14,3)
  1252. IF ~DATATYPE(ulb,'W') | ulb=0 THEN ulb=1
  1253. dlb=WORD(data.15,3)
  1254. IF ~DATATYPE(dlb,'W') THEN dlb=0
  1255. ptext='Level: 'level'   dl/ul:' comma(TRUNC(dlb/ulb+.005,2))
  1256. IF upflag=0 THEN ptext=ptext
  1257. IF upflag=1 THEN ptext=ptext'   Cmd:' opt arg
  1258. IF upflag=2 THEN ptext=ptext'   MSG:' msg.msgdir
  1259. IF upflag=3 THEN ptext=ptext'   Email'
  1260. IF upflag=4 THEN ptext=ptext'   ul:' plaindir'/'arg
  1261. IF upflag=5 THEN ptext=ptext'   dl:' plaindir'/'arg
  1262. IF upflag=6 THEN ptext=ptext'   Elapsed:'elapsed' '
  1263. CALL SETCLIP('BBSPOST4',CENTER(ptext,74))
  1264. ADDRESS BBSPOST 'UPDATE'
  1265. ptext=''
  1266. IF EXISTS(bbspath'Email/'sysop'/NEW_FILES') THEN ptext='NEW_FILES !'
  1267. IF EXISTS(bbspath'Lists/CBV_USERS') THEN ptext=ptext 'CBV_USERS !'
  1268. IF EXISTS(bbspath'Lists/NEW_USERS') THEN ptext=ptext 'NEW_USERS !'
  1269. IF chatrequest=1 THEN ptext=ptext 'CHAT REQUEST !'
  1270. ptext=STRIP(ptext GETCLIP('BBS_ERROR'))
  1271. CALL SETCLIP('BBS_ERROR')
  1272. IF ptext='' THEN ptext=' '
  1273. ELSE ptext=CENTER('!' ptext,74)
  1274. IF ptext~=GETCLIP('BBSPOST5') THEN
  1275.   DO
  1276.     CALL SETCLIP('BBSPOST5',ptext)
  1277.     ADDRESS BBSPOST 'UPDATE'
  1278.   END
  1279. RETURN
  1280.  
  1281.  
  1282. postfour:
  1283. PARSE ARG parg 
  1284. IF bbsprefs.12~=1 | ~SHOW('P','BBSPOST') THEN RETURN
  1285. ptext='Level: 'level'   dl/ul:' comma(TRUNC(dlb/ulb+.005,2))
  1286. CALL SETCLIP('BBSPOST4',CENTER(ptext'   'parg,74))
  1287. ADDRESS 'BBSPOST' 'UPDATE'
  1288. RETURN
  1289.  
  1290.  
  1291. whodat:
  1292. MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||''||''||' 'name' level 'level' '||''
  1293. RETURN
  1294.  
  1295.  
  1296. showtime:
  1297. mins=TIME('E')%60
  1298. secs=TRUNC(TIME('E')//60)+1
  1299. IF secs>59 THEN secs=59
  1300. IF secs<10 THEN secs='0'secs
  1301. line=' Time:  Used' mins':'secs
  1302. mins=(maxtime-TIME('E'))%60
  1303. secs=TRUNC((maxtime-TIME('E'))//60)
  1304. IF secs<10 THEN secs='0'secs
  1305. line=line'   Remaining' mins':'secs
  1306. SAY line||CR
  1307.  
  1308. checktime:
  1309. IF TIME('E')>maxtime THEN
  1310.   DO
  1311.     SAY 'Sorry,' name 'your time has expired.'CR
  1312.     CALL send2log('*** Time Expired ***')
  1313.     SIGNAL LOGOUT2
  1314.   END
  1315. IF TIME('E')>(maxtime-120) THEN SAY '*** Less than 2 minutes left! ***'CR
  1316. CALL whodat()
  1317. CALL checkdcd()
  1318. RETURN
  1319.  
  1320.  
  1321. setdir:
  1322. PARSE ARG tempdir
  1323. CALL PRAGMA('D',STRIP(tempdir))
  1324. directory=PRAGMA('D')
  1325. Data directory
  1326. slash=LASTPOS('/',directory)
  1327. IF slash=0 THEN slash=LASTPOS(':',directory)
  1328. plaindir=directory
  1329. IF slash>0 THEN plaindir=SUBSTR(plaindir,slash+1)
  1330. RETURN
  1331.  
  1332.  
  1333. config:
  1334. arg='s:CONFIG.BBS'
  1335. IF ~EXISTS(arg) THEN arg='BBS:BBS_TEXT/CONFIG.BBS'
  1336. IF readlines(arg 1) THEN
  1337.   DO
  1338.     SAY 's:CONFIG.BBS and BBS:BBS_TEXT/CONFIG.BBS are both missing!'CR
  1339.     SIGNAL DONE2
  1340.   END
  1341. compos=POS('/*',lynes.1)
  1342. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  1343. bbsname=STRIP(lynes.1)
  1344. CALL SETCLIP('BBS_bbsname',bbsname)
  1345. sysop=WORD(lynes.2,1)
  1346. compos=POS('/*',lynes.3)
  1347. IF compos>0 THEN lynes.3=LEFT(lynes.3,compos-1)
  1348. exclusion=STRIP(lynes.3)
  1349. bbsdevice=WORD(lynes.4,1)
  1350. sysoplevel=WORD(lynes.5,1)
  1351. bbspath=WORD(lynes.6,1)
  1352. IF ~EXISTS(bbspath) THEN
  1353.   DO
  1354.     SAY bbspath 'does not exist!'CR
  1355.     SIGNAL DONE2
  1356.   END
  1357. testchar=RIGHT(bbspath,1)
  1358. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  1359. CALL SETCLIP('BBS_path',bbspath)
  1360. msgpath=WORD(lynes.7,1)
  1361. IF ~EXISTS(msgpath) THEN
  1362.   DO
  1363.     SAY msgpath 'does not exist!'CR
  1364.     SIGNAL DONE2
  1365.   END
  1366. testchar=RIGHT(msgpath,1)
  1367. IF testchar~='/' & testchar~=':' THEN msgpath=msgpath'/'
  1368. CALL SETCLIP('BBS_msgpath',msgpath)
  1369. msgpath=msgpath'MSG'
  1370. libpath=WORD(lynes.8,1)
  1371. IF ~EXISTS(libpath) THEN
  1372.   DO
  1373.     SAY libpath 'does not exist!'CR
  1374.     SIGNAL DONE2
  1375.   END
  1376. testchar=RIGHT(libpath,1)
  1377. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  1378. CALL SETCLIP('BBS_libpath',libpath)
  1379. extdevs=''
  1380. DO i=1 TO WORDS(lynes.10)
  1381.   test=WORD(lynes.10,i)
  1382.   IF POS(':',test)=0 THEN ITERATE i
  1383.   IF LEFT(test,2)='/*' THEN LEAVE i
  1384.   extdevs=STRIP(extdevs test)
  1385. END
  1386. SYSTEM_MSG_LIMIT=WORD(lynes.11,1)
  1387. SYSTEM_SPACE_LIMIT=WORD(lynes.12,1)
  1388. maxidle=WORD(lynes.13,1)
  1389. maxtime=WORD(lynes.14,1)
  1390. maxbps=WORD(lynes.15,1)
  1391. IF ~DATATYPE(maxbps,'W') THEN maxbps=2400
  1392. CALL SETCLIP('BBS_baud',maxbps)
  1393. DO i=16 TO 41
  1394.   j=i-15
  1395.   bbsprefs.j=STRIP(WORD(lynes.i,1))
  1396. END
  1397. spellpath=WORD(lynes.9,1)
  1398. IF bbsprefs.5 & ~EXISTS(spellpath) THEN
  1399.   DO
  1400.     SAY spellpath 'does not exist!'CR
  1401.     bbsprefs.5=0
  1402.   END
  1403. IF bbsprefs.10 THEN scratch=bbspath'Scratch'
  1404. ELSE scratch='RAM:Scratch'
  1405. CALL MAKEDIR(scratch)
  1406. IF bbsprefs.12=1 THEN
  1407.   IF ~SHOW('P','BBSPOST') THEN ADDRESS AREXX bbsPOST.baud
  1408. IF ~DATATYPE(bbsprefs.16,'W') THEN bbsprefs.16=3
  1409. extension=WORD(lynes.32,1)
  1410. arccom=lynes.33
  1411. compos=POS('/*',lynes.33)
  1412. IF compos>0 THEN lynes.33=LEFT(lynes.33,compos-1)
  1413. arccom=STRIP(lynes.33)
  1414. IF LEFT(extension,1)~='.' THEN
  1415.   DO
  1416.     extension='.lzh'
  1417.     arccom='lharc -m m'
  1418.   END
  1419. lpost=WORD(lynes.34,1)
  1420. IF ~DATATYPE(lpost,'W') THEN lpost=3
  1421. rpost=WORD(lynes.35,1)
  1422. IF ~DATATYPE(rpost,'W') THEN rpost=11
  1423. IF SHOW('P','BBSPOST') THEN ADDRESS 'BBSPOST' 'CONFIG' lpost rpost
  1424. compos=POS('/*',lynes.42)
  1425. IF compos>0 THEN lynes.42=LEFT(lynes.42,compos-1)
  1426. bbsprefs.27=STRIP(lynes.42)
  1427. real=1
  1428. IF WORD(lynes.43,1)=0 THEN real=0
  1429. RETURN
  1430.  
  1431.  
  1432. readlogs:
  1433. t=getinput(1 1 'Read [D]aily, [N]umbers, or [Q]uick log? (dnq) > ')
  1434. IF t='' THEN RETURN
  1435. IF t='D' THEN
  1436.   DO
  1437.     arg=getinput(1 0 '['pen3'RETURN'def']=TODAY, or enter Log Date ('pen3||DATE('S')||def') > ')
  1438.     IF arg='' THEN arg=DATE('S')
  1439.     arg=bbspath'Logs/log.'arg
  1440.   END
  1441. ELSE IF t='N' THEN arg=bbspath'logs/QUICK.log'
  1442. ELSE IF t='Q' THEN arg=bbspath'logs/Numbers.log'
  1443. ELSE RETURN
  1444. CALL showtext(arg 1)
  1445. RETURN
  1446.  
  1447.  
  1448. loadcourtesy:
  1449. IF courtesyflag=0 & courtesy='' & EXISTS(bbspath'Lists/Courtesy') THEN
  1450.   DO
  1451.     IF readopen(bbspath'Lists/Courtesy') THEN
  1452.       DO
  1453.         SAY 'Checking Courtesy List...'CR
  1454.         DO i=1
  1455.           line=READLN(f)
  1456.           IF EOF(f) THEN BREAK
  1457.           line=cleanstring(1':'line)
  1458.           courtesy=courtesy line
  1459.         END
  1460.         CALL CLOSE(f)
  1461.         MSG ''
  1462.         MSG pen3'Courtesy List:'def
  1463.         MSG courtesy
  1464.       END
  1465.   END
  1466. RETURN
  1467.  
  1468.  
  1469. fileheader:
  1470. SAY 'Filename          Bytes File# Library         KeyWords'CR
  1471. SAY pen3||LEFT('=',77,'=')||def||CR
  1472. RETURN
  1473.  
  1474.  
  1475. showalpha:
  1476. libtext=0
  1477. IF DATATYPE(arg,'W') THEN
  1478.   DO
  1479.     dirnum=arg
  1480.     arg=''
  1481.     test='Y'
  1482.     IF chdir2()>0 THEN
  1483.       DO
  1484.         libtext=1
  1485.         RETURN
  1486.       END
  1487.   END
  1488. ELSE
  1489.   DO
  1490.     test=getinput(1 1 'Show one library only? (Ny) > ')
  1491.     IF test='Y' THEN
  1492.       DO
  1493.         IF chdir()>0 THEN
  1494.           DO
  1495.             libtext=1
  1496.             RETURN
  1497.           END
  1498.       END
  1499.   END
  1500.  
  1501. showalpha2:
  1502. libtext=1
  1503. IF test='Y' THEN
  1504.   DO
  1505.     CALL postfour('AlphaList:' plaindir)
  1506.     lfile=libpath||plaindir'/.'STRIP(LEFT(plaindir,15))
  1507.     IF EXISTS(lfile) THEN
  1508.       DO
  1509.         CALL showtext(lfile 1)
  1510.         nonstop=0
  1511.         RETURN
  1512.       END
  1513.     filecount=WORDS(SHOWDIR(bbspath'FileNotes/'plaindir))
  1514.   END
  1515. ELSE filecount=files.0
  1516. SAY '  'filecount 'files.'CR
  1517. CALL fileheader()
  1518. count=0
  1519. DO wi=1 TO alpha.0
  1520.   CALL busywait(60 wi alpha.0)
  1521.   IF test='Y' THEN
  1522.     DO
  1523.       IF count>=filecount THEN LEAVE wi
  1524.       IF UPPER(LEFT(plaindir,12))~=UPPER(LEFT(WORD(alpha.wi,5),12)) THEN
  1525.         ITERATE wi
  1526.     END
  1527.   jj=WORD(alpha.wi,4)
  1528.   IF jj>level | FIND(data.21,UPPER(dirs.jj))>0 THEN
  1529.     ITERATE wi
  1530.   CALL busywait(4 0)
  1531.   SAY alpha.wi||CR
  1532.   count=count+1
  1533.   IF (count+2)//linesperpage=0 & wi<alpha.0 THEN
  1534.     IF waiting2() THEN
  1535.       DO
  1536.         CALL busywait(4 1)
  1537.         LEAVE wi
  1538.       END
  1539.   CALL busywait(4 1)
  1540. END
  1541. CALL busywait(4 0)
  1542. nonstop=0
  1543. IF waitchar~='Q' THEN CALL waiting()
  1544. RETURN
  1545.  
  1546.  
  1547. otheruser:
  1548. SAY lm
  1549. CALL bbsOther.rexx(maxtime-TRUNC(TIME('E')) name sysoplevel real bbspath bbsname)
  1550. RETURN
  1551.  
  1552.  
  1553. changename:
  1554. ARG cname
  1555. IF level<=sysoplevel THEN RETURN
  1556. IF cname='' THEN cname=getinput(1 0 'Current Username (include underscore): ')
  1557. IF readlines(bbspath'Users/'cname 1)>0 THEN RETURN
  1558. IF WORD(lynes.20,1)>level THEN RETURN
  1559. CALL SETCLIP('BBS_oldname',cname)
  1560. CALL ChangeUserName.rexx()
  1561. ncname=GETCLIP('BBS_newname')
  1562. IF name=cname THEN name=ncname
  1563. IF GETCLIP('BBS_oldname')='' THEN
  1564.   CALL send2log('Name change from' cname 'to' ncname)
  1565. sortuserflag=1
  1566. CALL SETCLIP('BBS_oldname')
  1567. CALL SETCLIP('BBS_newname')
  1568. RETURN ncname
  1569.  
  1570.  
  1571. levelreport:
  1572. SAY lm
  1573. CALL bbsNewUsers.rexx(name level colorflag maxtime-TRUNC(TIME('E')))
  1574. RETURN
  1575.  
  1576.  
  1577. filereport:
  1578. SAY 'Searching for mismatches between files and filenotes...'CR
  1579. DO i=1 TO sysoplevel+1
  1580.   IF dirs.i='' THEN ITERATE
  1581.   SAY dirs.i'                               'lineup||CR
  1582.   rfiles=SHOWDIR(libpath||dirs.i)
  1583.   rnotes=SHOWDIR(bbspath'FileNotes/'dirs.i)
  1584.   IF WORDS(rfiles)~=WORDS(rnotes) THEN
  1585.     DO
  1586.       line='Compare files & filenotes in'pen3 dirs.i||def'. '
  1587.       DO j=1 TO WORDS(rfiles)
  1588.         IF FIND(UPPER(rnotes),UPPER(WORD(rfiles,j)))=0 THEN
  1589.           line=line WORD(rfiles,j)
  1590.       END
  1591.       SAY line||CR
  1592.     END
  1593. END
  1594. Send '^G'
  1595. CALL waiting()
  1596. RETURN
  1597.  
  1598.  
  1599. mailreport:
  1600. SAY 'Checking ALL pending Email...'CR
  1601. SAY pen3' - Use CTRL-E to Exit -'def||CR
  1602. SAY CR
  1603. mailrep=SHOWDIR(bbspath'Email','D')
  1604. mailfil=SHOWDIR(bbspath'EmailFiles','D')
  1605. lastemail=WORD(data.17,3)
  1606. IF ~DATATYPE(lastemail,'W') THEN lastemail=0
  1607. IF lastemail=countcheck('Numbers/LastMail' 0) THEN
  1608.   DO
  1609.     DROP mailrep. mailfil.
  1610.     RETURN
  1611.   END
  1612. mailynes.=''
  1613. mk=0
  1614. DO mi=1 TO WORDS(mailrep)
  1615.   muser=WORD(mailrep,mi)
  1616.   IF muser=sysop | muser=name THEN ITERATE mi
  1617.   mlist=SHOWDIR(bbspath'Email/'muser)
  1618.   IF WORDS(mlist)>0 THEN SAY lineup||RIGHT(muser,40)||CR
  1619.   DO mj=1 TO WORDS(mlist)
  1620.     fuser=WORD(mlist,mj)
  1621.     IF POS(sysop,fuser)>0 THEN ITERATE mj
  1622.     IF logonflag=0 THEN
  1623.       DO
  1624.         mk=mk+1
  1625.         mailynes.mk=pen3||LEFT(muser,20) 'from'def LEFT(fuser,20) DATE(,WORD(STATEF(bbspath'Email/'muser'/'fuser),5),'I')
  1626.       END
  1627.     IF POS(sysop,fuser)=0 & POS(name,fuser)=0 THEN
  1628.       DO
  1629.         testnum=RIGHT(fuser,LENGTH(fuser)-LASTPOS('.',fuser))
  1630.         IF testnum>emailnum THEN emailnum=testnum
  1631.         IF testnum>lastemail THEN
  1632.           DO
  1633.             CALL showtext(bbspath'Email/'muser'/'fuser 1)
  1634.             SAY CR
  1635.             SAY CR
  1636.             IF waitchar='Q' THEN LEAVE mi
  1637.           END
  1638.       END
  1639.   END
  1640.   IF logonflag=0 & FIND(mailfil,muser)>0 THEN
  1641.     DO
  1642.       efilelist=SHOWDIR(bbspath'EmailFiles/'muser)
  1643.       IF WORDS(efilelist)>0 THEN
  1644.         DO
  1645.           mk=mk+1
  1646.           mailynes.mk=pen3||LEFT(muser,20) 'emailfiles'def efilelist
  1647.         END
  1648.     END
  1649. END
  1650. data.17=WORD(data.17,1) WORD(data.17,2) countcheck('Numbers/LastMail' 0)
  1651. IF mk>0 THEN
  1652.   DO
  1653.     lynes.0=mk
  1654.     DO mi=1 TO mk
  1655.       lynes.mi=mailynes.mi
  1656.     END
  1657.     CALL seelines(1)
  1658.     nonstop=0
  1659.     CALL waiting()
  1660.   END
  1661. ELSE SAY 'No unseen Email pending.'CR
  1662. DROP mailrep. mailfil. mailynes. mlist
  1663. RETURN
  1664.  
  1665.  
  1666. jump2rexx:
  1667. arg=bbspath'BBS_TEXT/REXXDOORS'
  1668. IF EXISTS(arg) THEN CALL showtext(arg 0)
  1669. CALL sound('JUMP')
  1670. SAY lm
  1671. CALL bbsDoors.rexx(TRUNC(maxtime-TIME('E'))-42 name password)
  1672. x=GETCLIP('BBS_maxtime')
  1673. CALL SETCLIP('BBS_maxtime')
  1674. IF DATATYPE(x,'W') THEN maxtime=x+TIME('E')
  1675. x=GETCLIP('BBS_winnings')
  1676. IF DATATYPE(x,'W') THEN winnings=x
  1677. CALL SETCLIP('BBS_winnings')
  1678. RETURN
  1679.  
  1680.  
  1681. sortlibraries:
  1682. SAY 'Sorting Libraries...'CR
  1683. count=0
  1684. sdirs.=''
  1685. DO i=1 TO level
  1686.   IF dirs.i='' THEN ITERATE i
  1687.   count=count+1
  1688.   sdirs.count=dirs.i i
  1689. END
  1690. sdirs.0=count
  1691. IF count>0 THEN CALL QSort(1,count,sdirs)
  1692. count=0
  1693. libs.=''
  1694. DO i=1 TO sdirs.0
  1695.   tempnum=WORD(sdirs.i,2)
  1696.   tempdir=WORD(sdirs.i,1)
  1697.   IF FIND(data.21,UPPER(tempdir))=0 THEN
  1698.     DO
  1699.       string=' '
  1700.       IF tempnum<10 THEN string=string' '
  1701.       string=string || tempnum'. 'LEFT(tempdir,14)
  1702.       count=count+1
  1703.       libs.count=string
  1704.     END
  1705. END
  1706. libs.0=count%4
  1707. IF (count//4)>0 THEN libs.0=libs.0+1
  1708. DO i=1 TO libs.0
  1709.   DO j=1 TO 3
  1710.     k=i+j*libs.0
  1711.     IF k<=count THEN libs.i=libs.i||libs.k
  1712.   END
  1713. END
  1714. DROP sdirs.
  1715. RETURN
  1716.  
  1717.  
  1718. sortconferences:
  1719. SAY 'Sorting Conferences...'CR
  1720. count=0
  1721. smsg.=''
  1722. DO i=1 TO level
  1723.   IF msg.i='' THEN ITERATE i
  1724.   count=count+1
  1725.   smsg.count=msg.i i
  1726. END
  1727. smsg.0=count
  1728. IF count>0 THEN CALL QSort(1,count,smsg)
  1729. count=0
  1730. msgs.=''
  1731. DO i=1 TO smsg.0
  1732.   tempnum=WORD(smsg.i,2)
  1733.   tempdir=WORD(smsg.i,1)
  1734.   IF FIND(data.21,tempnum)=0 THEN
  1735.     DO
  1736.       string=' '
  1737.       IF tempnum<10 THEN string=string' '
  1738.       string=string || tempnum'.'
  1739.       IF WORD(data.22,tempnum)='' | WORD(data.22,tempnum)>=0 THEN
  1740.         string=string LEFT(tempdir,20)
  1741.       ELSE string=string pen2'-OFF-'def LEFT(tempdir,14)
  1742.       count=count+1
  1743.       msgs.count=string
  1744.     END
  1745. END
  1746. msgs.0=count%3
  1747. IF (count//3)>0 THEN msgs.0=msgs.0+1
  1748. DO i=1 TO msgs.0
  1749.   DO j=1 TO 2
  1750.     k=i+j*msgs.0
  1751.     IF k<=count THEN msgs.i=msgs.i msgs.k
  1752.   END
  1753. END
  1754. DROP smsg.
  1755. RETURN
  1756.  
  1757.  
  1758. readmessages:
  1759. SAY lm
  1760. CALL SETCLIP('BBSMSG_ARG',colorflag arg)
  1761. CALL bbsMsg.rexx(maxtime-TRUNC(TIME('E')) name password)
  1762. CALL loaddata()
  1763. CALL checkemail()
  1764. RETURN
  1765.  
  1766.  
  1767. showmarked:
  1768. ARG ff .
  1769. IF WORDS(data.24)<1 THEN RETURN
  1770. fline='These unread conference messages have been ['pen3'M'pen6']arked as addressed to you:'
  1771. IF ff THEN
  1772.   DO
  1773.     SAY CR
  1774.     SAY pen6||fline||def||CR
  1775.   END
  1776. tempkk=data.24
  1777. DO i=1 TO WORDS(tempkk)
  1778.   tempk=WORD(tempkk,i)
  1779.   PARSE VAR tempk kdir'/'kmsg
  1780.   line=RIGHT(kmsg,6) 'in the'pen3 msg.kdir def'conference'
  1781.   IF EXISTS(msgpath||tempk) THEN
  1782.     DO
  1783.       IF ff THEN SAY line'.'CR
  1784.       ELSE fline=fline'0A'x||line'.'
  1785.     END
  1786.   ELSE
  1787.     DO
  1788.       line=line 'is missing.'
  1789.       IF ff THEN SAY line||CR
  1790.       ELSE fline=fline'0A'x||line
  1791.       mkw=FIND(data.24,tempk)
  1792.       data.24=STRIP(DELWORD(data.24,mkw,1))
  1793.       CALL savedata(0)
  1794.     END
  1795. END
  1796. IF ff THEN
  1797.   DO
  1798.     CALL waiting()
  1799.     SAY CR
  1800.   END
  1801. ELSE
  1802.   DO
  1803.     IF writeopen(bbspath'EmailFiles/'name'/Marked')=0 THEN RETURN
  1804.     CALL WRITELN(f,fline)
  1805.     CALL CLOSE(f)
  1806.   END
  1807. RETURN
  1808.  
  1809.  
  1810. readmail:
  1811. ARG fromenu .
  1812. replysubj=''
  1813. IF fromenu THEN SAY lm
  1814. ELSE arg=''
  1815. CALL SETCLIP('BBSMAIL_ARG',fromenu arg)
  1816. allargs=bbsMail.rexx(maxtime-TRUNC(TIME('E')) name password)
  1817. CALL loaddata()
  1818. IF DATATYPE(allargs,'N') THEN allargs=''
  1819. IF allargs~='' THEN
  1820.   DO
  1821.     CALL dload2()
  1822.     CALL readmail(0)
  1823.   END
  1824. CALL checkemail()
  1825. RETURN
  1826.  
  1827.  
  1828. checkemail:
  1829. x=GETCLIP('BBS_email')
  1830. CALL SETCLIP('BBS_email')
  1831. If DATATYPE(x,'W') THEN
  1832.   IF emailonline>-1 THEN emailonline=emailonline+x
  1833. RETURN
  1834.  
  1835.  
  1836. countcheck:
  1837. PARSE ARG fname' 'cknum .
  1838. fname=bbspath||fname
  1839. IF ~EXISTS(fname) THEN
  1840.   DO
  1841.     IF cknum=0 THEN RETURN 0
  1842.     IF ~writeopen(fname) THEN RETURN 0
  1843.     CALL WRITELN(f,cknum)
  1844.     CALL CLOSE(f)
  1845.     RETURN cknum
  1846.   END
  1847. IF ~readopen(fname) THEN
  1848.   DO
  1849.     CALL DELAY(99)
  1850.     IF ~readopen(fname) THEN RETURN cknum
  1851.   END
  1852. retval=STRIP(READLN(f))
  1853. CALL CLOSE(f)
  1854. IF ~DATATYPE(retval,'W') THEN retval=0
  1855. IF ~DATATYPE(cknum,'W') THEN cknum=0
  1856. IF retval<cknum THEN
  1857.   DO
  1858.     IF writeopen(fname) THEN
  1859.       DO
  1860.         CALL WRITELN(f,cknum)
  1861.         CALL CLOSE(f)
  1862.         RETURN cknum
  1863.       END
  1864.   END
  1865. RETURN retval
  1866.  
  1867.  
  1868. sysED:
  1869. IF level<99 THEN RETURN
  1870. arg=getinput(0 0 'Textfile To Edit: ')
  1871. IF arg='' THEN RETURN
  1872. SAY lm
  1873. CALL bbsEd.rexx(1 arg name TRUNC(maxtime-TIME('E'))-28)
  1874. CALL checkfilechanges()
  1875. RETURN
  1876.  
  1877.  
  1878. editor:
  1879. PARSE ARG edarg
  1880. SAY lm
  1881. IF bbsWrite.rexx(edarg)=0 THEN RETURN
  1882. IF WORD(edarg,3)='MAIL' THEN
  1883.   DO
  1884.     IF emailonline>=0 THEN emailonline=emailonline+1
  1885.   END
  1886. ELSE
  1887.   DO
  1888.     grand=grand+1
  1889.     IF ~DATATYPE(msg.msgdir.0,'W') THEN msg.msgdir.0=1
  1890.     ELSE msg.msgdir.0=msg.msgdir.0+1
  1891.   END
  1892. CALL loaddata()
  1893. RETURN
  1894.  
  1895.  
  1896. edinfo:
  1897. PARSE ARG t1,t2,t3
  1898. IF level<sysoplevel THEN RETURN 0
  1899. IF getinput(1 1 'Edit the'pen3 t2 def||t3 'info file? (Ny) > ')='Y' THEN
  1900.   DO
  1901.     IF ~EXISTS(t) THEN
  1902.       DO
  1903.         IF writeopen(t1)~=0 THEN
  1904.           DO
  1905.             CALL WRITELN(f,TRIM(CENTER('***'pen3 t2 def||t3 '***',75)))
  1906.             CALL WRITELN(f,LEFT('',75,'='))
  1907.             CALL CLOSE(f)
  1908.             CALL DELAY(28)
  1909.           END
  1910.       END
  1911.     CALL bbsEd.rexx(1 t1 name TRUNC(maxtime-TIME('E'))-28)
  1912.     RETURN 1
  1913.   END
  1914. RETURN 0
  1915.  
  1916.  
  1917. shell:
  1918. SAY CR
  1919. olddir=PRAGMA('D')
  1920. DO WHILE(UPPER(opt)~='EXIT')
  1921.   SAY bak2||TIME('C')||def PRAGMA('D')||CR
  1922.   OPTIONS PROMPT pen3'Type EXIT to quit AmigaDOS> 'def
  1923.   PARSE PULL opt' 'arg
  1924.   CALL checkdcd()
  1925.   IF(UPPER(opt)='CD') THEN CALL setdir(arg)
  1926.   ELSE IF EXISTS(opt)~=0 THEN
  1927.     DO
  1928.       IF LEFT(STATEF(opt),3)='DIR' THEN CALL setdir(opt)
  1929.     END
  1930.   ELSE IF opt~='' & UPPER(opt)~='EXIT' THEN
  1931.     ADDRESS COMMAND opt '<* >*' arg
  1932. END
  1933. CALL PRAGMA('D',olddir)
  1934. RETURN
  1935.  
  1936.  
  1937. yell:
  1938. chatrequest=1
  1939. IF excuses.1='' THEN
  1940.   DO
  1941.     IF readopen(bbspath'Lists/Excuses') THEN
  1942.       DO
  1943.         DO i=1
  1944.           line=READLN(f)
  1945.           IF EOF(f) THEN BREAK
  1946.           excuses.i=line
  1947.         END
  1948.         excuses.0=i-1
  1949.         CALL CLOSE(f)
  1950.       END
  1951.   END
  1952. j=TIME('S')//excuses.0+1
  1953. SAY CR
  1954. SAY 'Sorry, your SysOp,' sysop','CR
  1955. IF excuses.j~='' THEN SAY excuses.j||CR
  1956. ELSE SAY 'is not available, please leave a ['pen3'C'def']omment.'CR
  1957. SAY CR
  1958. IF bbsprefs.13 THEN RETURN
  1959. SAY 'I''m yelling anyway...'CR
  1960. SAY 'If nobody answers, please try again later or leave a ['pen3'C'def']omment'CR
  1961. CALL sound('YELL')
  1962. ADDRESS AREXX bbsSpeak.rexx 'CHAT' name bbspath saypath
  1963. RETURN
  1964.  
  1965.  
  1966. /* online change to member. Sysop triggered by BumpMember.baud */
  1967. /* user triggered by Call Back Verification CBV: */
  1968. validate:
  1969. ARG varg .
  1970. IF readopen(bbspath'BBS_TEXT/'varg) THEN
  1971.   DO
  1972.     SAY CR
  1973.     SAY 'You are being validated.  Please wait...'CR
  1974.     SAY CR
  1975.     DO lvi=1 TO 22
  1976.       line=READLN(f)
  1977.       IF lvi=11 THEN data.11=line
  1978.       IF lvi=17 THEN data.17=WORD(line,1) WORD(data.17,2) WORD(data.17,3)
  1979.       IF lvi=20 THEN data.20=line
  1980.       IF lvi=21 THEN data.21=line
  1981.     END
  1982.     data.22=line
  1983.     CALL CLOSE(f)
  1984.     CALL setdata()
  1985.     CALL sortlibraries()
  1986.     CALL sortconferences()
  1987.     CALL setmsgs()
  1988.     SAY CR
  1989.     CALL logonstats()
  1990.     CALL savedata(0)
  1991.     IF EXISTS(bbspath'BBS_TEXT/EMAIL_WELCOME') THEN
  1992.       DO
  1993.         CALL MAKEDIR(bbspath'EMail/'name)
  1994.         lastwrit=countcheck('Numbers/LastMail' 0)+1
  1995.         IF lastwrit>1 THEN CALL countcheck('Numbers/LastMail' lastwrit)
  1996.         lynes.=''
  1997.         lynes.1=' Mail:' lastwrit
  1998.         lynes.2=' From:' sysop
  1999.         lynes.3='   To:' name
  2000.         lynes.4=' Subj: Welcome to' bbsname
  2001.         lynes.5=' Date:' DATE('W') DATE()'  'TIME('C')
  2002.         lynes.6=LEFT('',74,'=')
  2003.         CALL readlines(bbspath'BBS_TEXT/EMAIL_WELCOME' 7)
  2004.         CALL savelines(bbspath'EMail/'name'/'sysop'.'lastwrit)
  2005.         SAY 'You have welcoming EMail.'CR
  2006.       END
  2007.     CALL waiting()
  2008.     IF bbsprefs.22=2 & varg='DEF.CBV' THEN
  2009.       DO
  2010.         SAY CR
  2011.         SAY pen3||name def'is now a fully valadated member of'pen3 bbsname||def||CR
  2012.         SAY 'All the features of the BBS will be available on your next call.'CR
  2013.         SAY CR
  2014.         CALL waiting()
  2015.         SIGNAL LOGOUT2
  2016.       END
  2017.     SIGNAL RESTART
  2018.   END
  2019. ELSE
  2020.   DO
  2021.     SAY 'Sorry. Auto-validation is disabled.'CR
  2022.     temp=' ***' sysop'!  You need a default file in BBS_TEXT!  (' varg ') *** '
  2023.     MSG bak2||temp||def||CR
  2024.     CALL Send2log(temp)
  2025.   END
  2026. RETURN
  2027.  
  2028.  
  2029. /* online time change. Sysop triggered by BumpTime.baud */
  2030. uptime:
  2031. mins=GETCLIP('BBS_minutes')
  2032. IF DATATYPE(mins,'N') THEN
  2033.   DO
  2034.     IF (mins*60)>maxtime THEN
  2035.       SAY name', this session''s time has been increased to' mins 'minutes.'CR
  2036.     ELSE MSG '*** User has not been told that his time has decreased.'
  2037.     CALL SETCLIP('BBS_minutes')
  2038.     maxtime=mins*60
  2039.   END
  2040. RETURN
  2041.  
  2042.  
  2043. /* online level change. Sysop triggered by BumpLevels.baud */
  2044. uplevel:
  2045. levl=GETCLIP('BBS_level')
  2046. IF DATATYPE(levl,'W') THEN
  2047.   DO
  2048.     IF levl>data.20 THEN
  2049.       SAY name', your level has been changed from' data.20 'to' levl'.'CR
  2050.     ELSE MSG '*** User has not been told his level has been reduced.'
  2051.     data.20=levl
  2052.     CALL setdata()
  2053.     IF menu='NEW' THEN menu='ALL'
  2054.     CALL sortlibraries()
  2055.     CALL sortconferences()
  2056.   END
  2057. RETURN
  2058.  
  2059.  
  2060. /* online ratio change. Sysop triggered by BumpLevels.baud */
  2061. upratio:
  2062. rats=GETCLIP('BBS_ratio')
  2063. IF DATATYPE(rats,'W') THEN
  2064.   DO
  2065.     SAY name', your upload:download ratio has been changed to 1:'rats'.'CR
  2066.     data.17=rats'  'WORD(data.17,2)'  'WORD(data.17,3)
  2067.     CALL SETCLIP('BBS_ratio')
  2068.   END
  2069. RETURN
  2070.  
  2071.  
  2072. bytes2user:
  2073. PARSE ARG indx bytes .
  2074. tfiles=WORD(data.indx,1)
  2075. tbytes=WORD(data.indx,3)
  2076. IF ~DATATYPE(tfiles,'W') THEN tfiles=0
  2077. IF ~DATATYPE(tbytes,'W') THEN tbytes=0
  2078. tbytes=tbytes+bytes
  2079. tfiles=tfiles+1
  2080. IF tfiles>1 THEN data.indx=tfiles 'files' tbytes 'bytes.'
  2081. ELSE data.indx='1 file' bytes 'bytes.'
  2082. data.indx=data.indx DATE()
  2083. CALL savedata(0)
  2084. RETURN
  2085.  
  2086.  
  2087. bbsspace:
  2088. ARG tabspace .
  2089. ADDRESS COMMAND 'C:info >'scratch'/infout' bbsdevice
  2090. ok=OPEN(f,scratch'/infout','R')
  2091. IF ok=0 THEN RETURN 20
  2092. line=READLN(f)
  2093. line=READLN(f)
  2094. line=READLN(f)
  2095. line=READLN(f)
  2096. CALL CLOSE(f)
  2097. IF tabspace<14 THEN SAY CR
  2098. bbsk=WORD(line,4)
  2099. IF ~DATATYPE(bbsk,'N') THEN
  2100.   DO
  2101.     line=bbsdevice 'is not an info compatible device!'
  2102.     CALL send2log(line)
  2103.     SAY pen3||line||def||CR
  2104.     bbsk=0
  2105.     RETURN
  2106.   END
  2107. bbsk=bbsk*512-SYSTEM_SPACE_LIMIT
  2108. IF bbsk<1 THEN bbsk=0
  2109. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'CR
  2110. RETURN
  2111.  
  2112.  
  2113. comma: PROCEDURE
  2114. ARG num .
  2115. t=''
  2116. x=POS('.',num)
  2117. IF x>0 THEN t=SUBSTR(num,x)
  2118. num=num%1
  2119. dgt=LENGTH(num)
  2120. numtext=''
  2121. IF dgt>3 THEN numtext=','RIGHT(num,3)
  2122. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  2123. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  2124. IF dgt>12 THEN
  2125.   DO
  2126.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  2127.     numtext=LEFT(num,dgt-12)||numtext
  2128.   END
  2129. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  2130. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  2131. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  2132. ELSE numtext=num
  2133. RETURN numtext||t
  2134.  
  2135.  
  2136. is_here:
  2137. ARG newname 
  2138. CALL WRITECH(STDOUT,'Checking filelist')
  2139. DO wi=1 TO 99
  2140.   IF wi//3=0 THEN CALL WRITECH(STDOUT,'.')
  2141.   IF dirs.wi='' THEN ITERATE wi
  2142.   IF ~EXISTS(bbspath'FileNotes/'dirs.wi'/'newname) THEN ITERATE wi
  2143.   line=pen3'*** File' newname 'already exists here'
  2144.   IF wi<=level THEN line=line 'in the' dirs.wi 'library'
  2145.   line=line'.'def
  2146.   SAY CR
  2147.   SAY line||CR
  2148.   SAY 'Original uploader should ['pen3'K'def']ill the file before uploading the replacement.'CR
  2149.   CALL waiting()
  2150.   RETURN 1
  2151. END
  2152. SAY CR
  2153. CALL cleanline(1)
  2154. RETURN 0
  2155.  
  2156.  
  2157. uload:
  2158. ARG frommenu
  2159. IF frommenu THEN
  2160.   DO
  2161.     SAY CR
  2162.     SAY pen3'PLEASE!'def 'Only upload 1 (one) archive at a time. NO BATCH UPLOADING! Thanks.'CR
  2163.   END
  2164. CALL bbsspace(12)
  2165. SAY CR
  2166. IF bbsk<1 THEN
  2167.   DO
  2168.     line='Upload area is full!'
  2169.     CALL send2log(line)
  2170.     SAY pen3||line||def||CR
  2171.     RETURN 1
  2172.   END
  2173. IF ~SHOW('P','BUILDALPHA') THEN CALL SETCLIP('BBS_UPLOAD')
  2174. IF frommenu & GETCLIP('BBS_UPLOAD')~='' THEN
  2175.   DO
  2176.     SAY pen3'Uploading is temporarily suspended while the filelists are rebuilding.'def
  2177.     CALL waiting()
  2178.     RETURN 1
  2179.   END
  2180. IF arg='' THEN arg=getinput(0 0 'Filename: ')  /* no filename given */
  2181. arg=cleanstring('0:'arg)
  2182. arg=COMPRESS(arg,' :/,;|#?*')  /* be sure no illegals here */
  2183. IF UPPER(arg)='RZ' | UPPER(LEFT(arg,4))='B000' THEN
  2184.   DO
  2185.     SAY CR
  2186.     SAY pen3'Error!'def arg 'is not allowed as a filename. Please try again.'CR
  2187.     CALL waiting()
  2188.     RETURN 1
  2189.   END
  2190. x=LASTPOS('/',arg)
  2191. IF x=0 THEN x=LASTPOS(':',arg)
  2192. IF x>0 THEN
  2193.   DO
  2194.     IF DATATYPE(SUBSTR(arg,x+1),'W') THEN
  2195.       DO
  2196.         SAY CR
  2197.         SAY pen3'Error!'def 'Whole numbers are not allowed as filenames!'CR
  2198.         CALL waiting()
  2199.         RETURN 1
  2200.       END
  2201.   END
  2202. tempnum=LENGTH(arg)-16
  2203. DO WHILE tempnum>0 & POS('EMAILFILES',UPPER(PRAGMA('D')))=0
  2204.   temp='          'pen3||arg def'is'pen3 tempnum||def
  2205.   IF tempnum=1 THEN temp=temp 'character'
  2206.   ELSE temp=temp 'characters'
  2207.   temp=temp 'too long for a filename.'
  2208.   SAY temp||CR
  2209.   arg=getinput(0 0 'Filename: ')
  2210.   arg=cleanstring('0:'arg)
  2211.   arg=COMPRESS(arg,' :/,;|#?*()+[]"{}')
  2212.   tempnum=LENGTH(arg)-16
  2213. END
  2214. IF arg='' THEN RETURN 1
  2215. IF frommenu THEN
  2216.   DO
  2217.     IF is_here(arg) THEN RETURN 1
  2218.     IF wi=999999 THEN RETURN 1
  2219.     IF bbsprefs.6=1 & sysoplevel>level THEN CALL setdir(libpath'Sysops')
  2220.     ELSE
  2221.       DO loop=1
  2222.         SAY 'Please select an appropriate library for -' pen3||arg def'-'CR
  2223.         temp=chdir()
  2224.         IF temp=0 THEN LEAVE loop
  2225.         IF temp=2 THEN RETURN 1
  2226.       END
  2227.   END
  2228. checkproto='T'
  2229. targ=arg
  2230. DO WHILE checkproto='T'
  2231.   arg=''
  2232.   SAY CR
  2233.   SAY 'Library:'pen3 plaindir def'  Filename:'pen3 targ def'  Protocol:'pen3 protocol||def||CR
  2234.   pline=' ['pen3'Q'def']uit ['pen3'T'def']ransfer-protocol'
  2235.   pline=pline '['pen3'U'def']pload (qtU) > '
  2236.   checkproto=getinput(1 1 pline)
  2237.   IF checkproto='Q' THEN RETURN 1
  2238.   IF checkproto='T' THEN CALL chpro()
  2239. END
  2240. arg=targ
  2241. CALL postuser(4)
  2242. CALL sound('UPLOAD')
  2243. uploadtime=TIME('E')
  2244. SAY 'Starting' protocol 'transfer.  Press' pen3'Esc'def 'to abort.'CR
  2245. CALL whodat()
  2246. uldlflag=1
  2247. DownLoad arg
  2248. IF RC>0 THEN RETURN 2
  2249. IF bbsXferStats.baud(14 arg colorflag protocol) THEN RETURN 2
  2250. rbytes=WORD(STATEF(arg),2)
  2251. IF rbytes<1 THEN
  2252.   DO
  2253.     CALL DELETE(arg)
  2254.     RETURN 2
  2255.   END
  2256. temp=''
  2257. DO WHILE temp~='N' & temp~='Y'
  2258.   temp=getinput(1 1 'Received' rbytes 'bytes. Was your upload successful? (ny) > ')
  2259. END
  2260. IF temp='N' THEN RETURN 2
  2261. IF TestArc.rexx(PRAGMA('D')'/'arg)>0 THEN
  2262.   DO
  2263.     SAY CR
  2264.     SAY pen3'***'def arg pen3'failed archive check!'def||CR
  2265.     SAY CR
  2266.     temp=getinput(1 1 'Do you believe the archive checker made a mistake? (Ny) > ')
  2267.     IF temp~='Y' THEN
  2268.       DO
  2269.         CALL DELETE(arg)
  2270.         SAY CR
  2271.         RETURN 2
  2272.       END
  2273.   END
  2274. CALL bytes2user(14 rbytes)
  2275. ADDRESS AREXX bbsNewFile.rexx name PRAGMA('D')'/'arg
  2276. IF bbsprefs.9 & name~=sysop THEN
  2277.   DO
  2278.     newufile=bbspath'EMail/'sysop'/NEW_FILES'
  2279.     IF EXISTS(newufile) THEN ok=OPEN(f,newufile,'A')
  2280.     ELSE
  2281.       DO
  2282.         ok=OPEN(f,newufile,'W')
  2283.         IF ok~=0 THEN CALL WRITELN(f,'*** New Files ***') 
  2284.       END
  2285.     IF ok~=0 THEN CALL WRITELN(f,name 'uploaded' plaindir'/'arg'  'DATE() TIME())
  2286.     CALL CLOSE(f)
  2287.   END
  2288. IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN
  2289.   DO
  2290.     uldlflag=0
  2291.     RETURN 0
  2292.   END
  2293. DO ui=sysoplevel+2 TO 100
  2294.   IF UPPER(dirs.ui)=UPPER(plaindir) THEN RETURN 0     /* no filenotes */
  2295. END
  2296. IF frommenu THEN
  2297.   DO
  2298.     uploadtime=TIME('E')-uploadtime
  2299.     IF bbsprefs.11 THEN
  2300.       DO
  2301.         maxtime=maxtime+uploadtime
  2302.         line='This session''s time has been increased by'
  2303.         line=line TRUNC(uploadtime%60+.05,1)+1 'minutes.'
  2304.         SAY CR
  2305.         SAY line||CR
  2306.         SAY 'Your ratio of bytes uploaded to bytes downloaded is 1:'ratio()||CR
  2307.       END
  2308.     CALL sound('NEW_FILE')
  2309.     uldlflag=0
  2310.     DO WHILE editnote(arg)  /* INSIST on a filenote */
  2311.     END
  2312.     CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  2313.     SAY pen3'Thank you for contributing to the' bbsname 'file libraries!'def||CR
  2314.   END
  2315. uldlflag=0
  2316. waitchar=''
  2317. RETURN 0
  2318.  
  2319.  
  2320. ratio:
  2321. upbytes=WORD(data.14,3)
  2322. IF ~DATATYPE(upbytes,'W') | upbytes<1 THEN upbytes=1
  2323. dnbytes=WORD(data.15,3)
  2324. IF ~DATATYPE(dnbytes,'W') | dnbytes<1 THEN dnbytes=1
  2325. RETURN TRUNC((dnbytes/upbytes)+.5)
  2326.  
  2327.  
  2328. findfiles:
  2329. PARSE ARG ffile .
  2330. IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN RETURN ffile
  2331. wi=0
  2332. IF DATATYPE(ffile,'W') THEN
  2333.   DO
  2334.     IF WORDS(files.ffile)<2 THEN RETURN 0
  2335.     dirtemp=WORD(files.ffile,1)
  2336.     IF finddirnum(dirtemp)>level | FIND(data.21,UPPER(dirtemp))>0 THEN
  2337.       DO
  2338.         CALL illegal_access()
  2339.         RETURN 0
  2340.       END
  2341.     CALL setdir(libpath||dirtemp)
  2342.   END
  2343. ELSE IF EXISTS(ffile) THEN
  2344.   DO
  2345.     IF EXISTS(bbspath'FileNotes/'plaindir'/'ffile) THEN
  2346.       DO
  2347.         IF readopen(bbspath'FileNotes/'plaindir'/'ffile)~=0 THEN
  2348.           DO
  2349.             line=READLN(f)
  2350.             CALL CLOSE(f)
  2351.             ffile=WORD(line,2)
  2352.           END
  2353.       END
  2354.   END
  2355. ELSE IF EXISTS(bbspath'Information'ffile) THEN
  2356.   RETURN bbspath'Information/'ffile
  2357. ELSE
  2358.   DO
  2359.     nextfilenum=countcheck('Numbers/LastFile' 0)+1
  2360.     CALL busywait(4 1)
  2361.     DO ni=nextfilenum TO 0 BY -1
  2362.       IF ni<1 THEN
  2363.         DO
  2364.           CALL busywait(4 0)
  2365.           SAY CR
  2366.           SAY '***' files.0 'filenames scanned,'pen3 ffile def'is not on the filelist!'CR
  2367.           SAY CR
  2368.           RETURN 0
  2369.         END
  2370.       IF ni>1 THEN CALL busywait(60 ni nextfilenum)
  2371.       argtemp=WORD(files.ni,2)
  2372.       IF UPPER(argtemp)=UPPER(ffile) THEN
  2373.         DO
  2374.           dirtemp=WORD(files.ni,1)
  2375.           jj=files.ni.0
  2376.           IF WORD(alpha.jj,4)>level | FIND(data.21,UPPER(dirtemp))>0 THEN
  2377.             DO
  2378.               CALL busywait(4 0)
  2379.               CALL illegal_access()
  2380.               RETURN 0
  2381.             END
  2382.           ffile=ni
  2383.           CALL setdir(libpath||dirtemp)
  2384.           LEAVE ni
  2385.         END
  2386.     END
  2387.     CALL busywait(4 0)
  2388.   END
  2389. IF wi=999999 THEN RETURN 0
  2390. ftemp=ffile
  2391. IF DATATYPE(ftemp,'W') THEN ftemp=WORD(files.ftemp,2)
  2392. IF ~EXISTS(ftemp) THEN
  2393.   DO
  2394.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'ftemp)
  2395.     IF WORDS(finfo)>7 THEN ftemp=WORD(finfo,8)
  2396.     IF ~EXISTS(ftemp) THEN
  2397.       DO
  2398.         IF finfo='' THEN SAY '***'pen3 PRAGMA('D')'/'ftemp def'was not found!'CR
  2399.         ELSE
  2400.           DO
  2401.             SAY CR
  2402.             IF WORDS(finfo)<8 THEN ftemp=plaindir'/'ftemp
  2403.             SAY '***'pen3 ftemp def'is not currently available online.'CR
  2404.             SAY ' Would you like me to notify the sysop'CR
  2405.             SAY ' that you''d like to receive this file?'CR
  2406.             IF getinput(1 1 ' (Ny) > ')='Y' THEN
  2407.               DO
  2408.                 enum=countcheck('Numbers/LastMail' 0)+1
  2409.                 CALL countcheck('Numbers/LastMail' enum)
  2410.                 IF writeopen(bbspath'email/'sysop'/'name'.'enum)=0 THEN RETURN
  2411.                 CALL WRITELN(f,' Mail: 'enum )
  2412.                 CALL WRITELN(f,' From: 'name)
  2413.                 CALL WRITELN(f,'   To: 'sysop)
  2414.                 CALL WRITELN(f,' Subj: File Request')
  2415.                 CALL WRITELN(f,' Date: 'DATE()'  'TIME('C'))
  2416.                 CALL WRITELN(f,'====================================================================')
  2417.                 CALL WRITELN(f,' Mr. Sysop, I would like to have this file : ')
  2418.                 CALL WRITELN(f,' 'ftemp)
  2419.                 CALL WRITELN(f,' ')
  2420.                 CALL CLOSE(f)
  2421.                 SAY CR
  2422.                 ADDRESS AREXX bbsSpeak.rexx 'FILE_REQUEST' name bbspath saypath
  2423.                 SAY 'Your file request has been sent!'CR
  2424.                 SAY 'The file should be in your Email soon.'CR
  2425.               END
  2426.             SAY CR
  2427.           END
  2428.         RETURN 0
  2429.       END
  2430.   END
  2431. RETURN ffile
  2432.  
  2433.  
  2434. illegal_access:
  2435. SAY CR
  2436. SAY '*** You are not authorized to access' ffile'!'CR
  2437. SAY '*** Send Email to' sysop 'to receive a higher level.'CR
  2438. SAY CR
  2439. IF DATATYPE(ffile,'W') THEN ffile=ffile WORD(files.ffile,2)
  2440. CALL send2log('Illegal Access Attempt!' ffile 'in' dirtemp)
  2441. RETURN
  2442.  
  2443.  
  2444. statuscheck:
  2445. PARSE ARG ffile
  2446. updownratio=WORD(data.17,1)
  2447. IF ~DATATYPE(updownratio,'N') THEN updownratio=100
  2448. updn=ratio()
  2449. dbytes=WORD(STATEF(ffile),2)
  2450. IF ~DATATYPE(dbytes,'W') THEN dbytes=1
  2451. IF ~DATATYPE(bps,'W') THEN bps=2400
  2452. needtime=dbytes%(bps%10)+10  /* plus 10 seconds for handshaking? */
  2453. SAY CR
  2454. SAY CR
  2455. CALL showtime()
  2456. SAY 'At least' TRUNC(needtime/60+.05,1) 'minutes needed to download' ffile 'at' bps 'baud.'CR
  2457. SAY 'After this transfer your upload:download ratio will be 1:'TRUNC((dbytes+dnbytes)/upbytes)||CR
  2458. IF level>(sysoplevel+1) THEN RETURN 0
  2459. IF (needtime+TIME('E'))>maxtime THEN
  2460.   DO
  2461.     SAY CR
  2462.     SAY 'Sorry, not enough time left in this session to download' dbytes 'bytes.'CR
  2463.     IF needtime>(WORD(data.11,1)*60) THEN
  2464.       SAY 'Leave email to the sysop to make other arrangements to receive this file.'CR
  2465.     SAY CR
  2466.     RETURN 1
  2467.   END
  2468. IF updownratio>0 & updn>updownratio THEN
  2469.   DO
  2470.     SAY CR
  2471.     line=pen3'       *** You must upload before you do any more downloading! ***'def
  2472.     SAY line||CR
  2473.     SAY '  Maintain a ratio of at least 1 byte uploaded for each' updownratio 'bytes downloaded.'CR
  2474.     IF bbsprefs.4 THEN RETURN 1
  2475.     SAY pen3'             - This requirement is temporarily suspended. -'def||CR
  2476.     SAY CR
  2477.   END
  2478. RETURN 0
  2479.  
  2480.  
  2481. ext_dload:
  2482. SAY CR
  2483. CALL checkdcd()
  2484. allargs=bbsExtDL.baud(name level TRUNC(maxtime-TIME('E')) linesperpage colorflag extdevs)
  2485. IF allargs='' | TRUNC(maxtime-TIME('E'))<30 THEN RETURN
  2486. CALL dload2()
  2487. RETURN
  2488.  
  2489.  
  2490. dload:
  2491. arg=STRIP(arg data.25)
  2492. data.25=''
  2493. curdir=PRAGMA('D')
  2494. OPTIONS PROMPT 'File numbers (and/or names): '
  2495. IF arg='' THEN PARSE PULL arg  /* no filename given */
  2496. IF arg='' THEN RETURN 0
  2497. allargs=TRANSLATE(arg,'     ',':/,;|')
  2498. tempargs=SPACE(allargs,1)
  2499. numchk=1
  2500. DO ui=1 TO WORDS(tempargs) WHILE STRIP(allargs)~=''
  2501.   arg=WORD(tempargs,ui)
  2502.   IF ~DATATYPE(arg,'W') THEN numchk=0
  2503.   wloc=WORDINDEX(allargs,FIND(allargs,arg))
  2504.   wi=0
  2505.   temp=findfiles(arg)
  2506.   IF wi=999999 THEN RETURN 0
  2507.   IF temp~=arg THEN
  2508.     DO
  2509.       allargs=DELWORD(allargs,FIND(allargs,arg),1)
  2510.       IF temp~=0 THEN allargs=INSERT(temp' ',allargs,wloc-1)
  2511.     END
  2512. END
  2513. IF numchk=0 THEN
  2514.   IF countcheck('Numbers/LastFile' 0)>500 THEN
  2515.     DO
  2516.       SAY LEFT('',20)||CR
  2517.       SAY bak2' BBBBS Tip:'def'  Next time try using fileNUMBERS instead of fileNAMES.'CR
  2518.       SAY '              The BBS is MUCH faster at locating files by number.'CR
  2519.     END
  2520.  
  2521. dload2:
  2522. curdir=PRAGMA('D')
  2523. allargs=STRIP(allargs data.25)
  2524. data.25=''
  2525. IF allargs='' THEN RETURN 0
  2526. sleepy='T'
  2527. DO WHILE sleepy='T'
  2528.   arg=''
  2529.   SAY LEFT('',20)||CR
  2530.   temp=WORD(allargs,1)
  2531.   IF DATATYPE(temp,'W') THEN temp=WORD(files.temp,2)
  2532.   test=''
  2533.   IF LENGTH(temp)>40 THEN
  2534.     DO
  2535.       test=temp
  2536.       temp=''
  2537.     END
  2538.   SAY 'Filename(s)'pen3 LEFT(temp,40) def'Protocol:'pen3 protocol||def||CR
  2539.   IF test~='' THEN SAY '           'pen3 test||def||CR
  2540.   DO di=2 TO WORDS(allargs)
  2541.     temp=WORD(allargs,di)
  2542.     IF DATATYPE(temp,'W') THEN temp=WORD(files.temp,2)
  2543.     SAY '           'pen3 temp||def||CR
  2544.   END
  2545.   pline='['pen3'A'def']uto-Logoff-after-transfer ['pen3'D'def']ownload'
  2546.   pline=pline '['pen3'Q'def']uit ['pen3'T'def']ransfer-protocol (aDqt)'
  2547.   sleepy=getinput(1 1 pline '> ')
  2548.   IF sleepy='Q' THEN RETURN 0
  2549.   IF sleepy='A' THEN sleepy='LOGOFF'
  2550.   IF sleepy='T' THEN CALL chpro()
  2551. END
  2552. DO WHILE allargs~=''
  2553.   errorflag=0
  2554.   extdir=''
  2555.   arg=WORD(allargs,1)
  2556.   allargs=STRIP(DELWORD(allargs,1,1))
  2557.   IF DATATYPE(arg,'W') THEN
  2558.     DO
  2559.       CALL setdir(libpath||WORD(files.arg,1))
  2560.       arg=WORD(files.arg,2)
  2561.     END
  2562.   notename=bbspath'FileNotes/'plaindir'/'arg
  2563.   finfo=''
  2564.   IF ~EXISTS(arg) THEN
  2565.     DO
  2566.       finfo=STATEF(notename)
  2567.       IF WORDS(finfo)>7 THEN
  2568.         DO
  2569.           temp=plaindir
  2570.           x=lastslash(WORD(finfo,8))
  2571.           arg=WORD(x,1)
  2572.           CALL setdir(WORD(x,2))
  2573.           plaindir=temp
  2574.         END
  2575.     END
  2576.   x=lastslash(arg)
  2577.   IF WORDS(x)>1 THEN
  2578.     DO
  2579.       arg=WORD(x,1)
  2580.       extdir=WORD(x,2)
  2581.       CALL setdir(extdir)
  2582.     END
  2583.   uldlflag=1
  2584.   DO dloadloop=1
  2585.     IF statuscheck(arg) THEN
  2586.       DO
  2587.         errorflag=1
  2588.         LEAVE dloadloop
  2589.       END
  2590.     CALL postuser(5)
  2591.     CALL sound('DOWNLOAD')
  2592.     SAY 'Starting' protocol 'transfer.  Press' pen3'Esc'def 'to abort.'CR
  2593.     CALL checktime()
  2594.     UpLoad arg
  2595.     IF RC>0 | bbsXferStats(15 arg colorflag protocol extdir) THEN
  2596.       DO
  2597.         errorflag=1
  2598.         LEAVE dloadloop
  2599.       END
  2600.     CALL bytes2user(15 WORD(STATEF(arg),2))
  2601.     IF extdir='' & POS('EMAILFILES',UPPER(PRAGMA('D')))=0 THEN
  2602.       DO dloadloop2=1 TO 1
  2603.         DO di=sysoplevel+2 TO 100
  2604.           IF UPPER(dirs.di)=UPPER(plaindir) THEN LEAVE dloadloop2
  2605.         END
  2606.         IF readlines(notename 1) THEN
  2607.           DO
  2608.             CALL send2log('Unable to increment download count for' plaindir'/'arg)
  2609.             LEAVE dloadloop2
  2610.           END
  2611.         dls=WORD(lynes.2,7)
  2612.         IF ~DATATYPE(dls,'W') THEN dls=0
  2613.         lynes.2=STRIP(DELWORD(lynes.2,7,1)) dls+1
  2614.         finfo=STATEF(notename)
  2615.         IF WORDS(finfo)>7 THEN finfo=SUBSTR(finfo,WORDINDEX(finfo,8))
  2616.         ELSE finfo=''
  2617.         CALL DELETE(notename)
  2618.         CALL savelines(notename)
  2619.         CALL DELAY(28)
  2620.         IF finfo~='' THEN ADDRESS COMMAND 'C:filenote' notename finfo
  2621.         IF WORD(data.16,1)<WORD(lynes.1,2) THEN
  2622.           DO
  2623.             lastbrowse=WORD(lynes.1,2)
  2624.             newfilesdate=DATE('S') TIME()
  2625.           END
  2626.       END
  2627.     LEAVE dloadloop
  2628.   END
  2629. END
  2630. uldlflag=0
  2631. CALL setdir(curdir)
  2632. IF errorflag THEN SAY pen3'*** Download Failed!'def||CR
  2633. IF sleepy='LOGOFF' THEN
  2634.   DO
  2635.     SAY CR
  2636.     SAY 'Logging'pen3 'OFF' def'in 10 seconds...'CR
  2637.     SAY 'Press'pen3 RETURN def'to return to'pen3 bbsname||def||CR
  2638.     SAY CR
  2639.     Timeout 10
  2640.     WAIT '?'
  2641.     t=RC
  2642.     Timeout maxidle
  2643.     IF t~=0 THEN SIGNAL LOGOUT2
  2644.   END
  2645. RETURN errorflag
  2646.  
  2647.  
  2648. lastslash:
  2649. PARSE ARG sarg 
  2650. sdir=''
  2651. slash=LASTPOS('/',sarg)
  2652. IF slash>2 THEN sdir=LEFT(sarg,slash-1)
  2653. ELSE
  2654.   DO
  2655.     slash=LASTPOS(':',sarg)
  2656.     IF slash>0 THEN sdir=LEFT(sarg,slash)
  2657.   END
  2658. IF slash>0 THEN sarg=SUBSTR(sarg,slash+1)
  2659. RETURN sarg sdir
  2660.  
  2661.  
  2662. editnote:
  2663. IF arg='' THEN
  2664.   DO
  2665.     PARSE PULL arg .
  2666.     IF arg='' THEN RETURN 0
  2667.   END
  2668. comment=''
  2669. IF ~EXISTS(arg) THEN
  2670.   DO
  2671.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'arg)
  2672.     temp=''
  2673.     IF WORDS(finfo)>7 THEN comment=WORD(finfo,8)
  2674.     ELSE
  2675.       DO
  2676.         IF level<sysoplevel THEN RETURN 0
  2677.         temp=getinput(1 1 'Is this file on an another device? (Nqy)')
  2678.       END
  2679.     IF temp='Y' THEN
  2680.       DO WHILE comment=''
  2681.         comment=getinput(0 0 'Enter linkfile using full dev:path/filename > ')
  2682.         IF comment='' THEN RETURN 0
  2683.         IF ~EXISTS(comment) THEN comment=''
  2684.       END
  2685.     ELSE IF temp='Q' THEN RETURN 0
  2686.   END
  2687. IF comment='' THEN
  2688.   DO
  2689.     arg=findfiles(arg)
  2690.     IF arg=0 THEN RETURN 0
  2691.     IF DATATYPE(arg,'W') THEN arg=WORD(files.arg,2)
  2692.   END
  2693. filedir=plaindir
  2694. CALL MAKEDIR(bbspath'FileNotes/'filedir)
  2695. IF ~EXISTS(bbspath'FileNotes/'filedir) THEN
  2696.   DO
  2697.     SAY pen3'*** Failed to open directory!' filedir||def||CR
  2698.     RETURN 0
  2699.   END
  2700. notename=bbspath'FileNotes/'filedir'/'arg
  2701. lynes.=''
  2702. filenum=countcheck('Numbers/LastFile' 0)
  2703. IF level>sysoplevel THEN firstedit=1
  2704. ELSE firstedit=5
  2705. IF EXISTS(notename) THEN
  2706.   DO
  2707.     IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  2708.     CALL bbsEd.rexx(firstedit notename name TRUNC(maxtime-TIME('E'))-28)
  2709.     CALL checkfilechanges()
  2710.     IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  2711.     RETURN 0
  2712.   END
  2713. IF comment='' THEN filedata=STATEF(libpath||filedir'/'arg)
  2714. ELSE filedata=STATEF(comment)
  2715. IF filedata='' THEN
  2716.   DO
  2717.     IF comment='' THEN line=filedir'/'arg
  2718.     ELSE line=comment
  2719.     SAY line 'does not exist!'CR
  2720.     RETURN 0
  2721.   END
  2722. bytes=WORD(filedata,2)
  2723. filenum=filenum+1
  2724. lynes.0=4
  2725. lynes.1='File: 'LEFT(filenum,5)' KeyWords:'
  2726. lynes.2='Name: 'LEFT(arg,27)' Size: 'bytes' bytes   Downloads: 0'
  2727. lynes.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'filedir
  2728. lynes.4=LEFT('',74,'=')
  2729. lynes.1=lynes.1 edkeywords(arg filedir)
  2730. diz='RAM:file_id.diz'
  2731. IF EXISTS(diz) THEN CALL readlines(diz 5)
  2732. CALL DELETE(diz)
  2733. CALL seelines(1)
  2734. edtype=''
  2735. CALL writebuffer(scratch'/NoteFile')
  2736. IF savelines(notename) THEN RETURN 0
  2737. IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  2738. CALL DELETE(libpath||filedir'/.'STRIP(LEFT(filedir,15)))
  2739. fncom='R'
  2740. DO WHILE fncom='R'
  2741.   CALL seelines(1)
  2742.   nonstop=0
  2743.   line='['pen3'E'def']dit'
  2744.   IF level>sysoplevel THEN line=line '['pen3'K'def']ill'
  2745.   line=line '['pen3'R'def']ead ['pen3'S'def']ave'
  2746.   IF level>sysoplevel THEN line=line '(ekrS) 'def
  2747.   ELSE line=line '(erS) 'def
  2748.   fncom=getinput(1 1 line)
  2749.   IF fncom='K' & level>sysoplevel THEN
  2750.     DO
  2751.       SAY 'Killing FileNote..'CR
  2752.       CALL DELETE(notename)
  2753.       RETURN 1
  2754.     END
  2755.   ELSE IF fncom='E' THEN
  2756.     DO
  2757.       IF bbsEd.rexx(firstedit notename name TRUNC(maxtime-TIME('E'))-28)>0 THEN RETURN 0
  2758.       CALL readlines(notename 1)
  2759.       CALL checkfilechanges()
  2760.       fncom='R'
  2761.     END
  2762.   ELSE IF fncom~='R' THEN
  2763.     DO
  2764.       SAY 'Adjusting filelist...'CR
  2765.       IF filenum<1 THEN filenum=1
  2766.       IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',1)
  2767.       CALL countcheck('Numbers/LastFile' filenum)
  2768.       files.0=files.0+1
  2769.       newcount=alpha.0+1
  2770.       alpha.0=newcount
  2771.       files.filenum=plaindir arg
  2772.       files.filenum.0=newcount
  2773.       libnum=finddirnum(plaindir)
  2774.       PARSE VAR lynes.1 . 'KeyWords:' keywords
  2775.       alpha.newcount=LEFT(arg,22-LENGTH(WORD(lynes.2,4)))
  2776.       alpha.newcount=alpha.newcount WORD(lynes.2,4) RIGHT(filenum,5)
  2777.       alpha.newcount=alpha.newcount RIGHT(libnum,2) LEFT(plaindir,12)
  2778.       alpha.newcount=alpha.newcount STRIP(LEFT(STRIP(keywords),32))
  2779.       IF EXISTS(bbspath'Lists/Files') THEN
  2780.         x=listOPEN(f,bbspath'Lists/Files','A')
  2781.       ELSE x=listOPEN(f,bbspath'Lists/Files','W')
  2782.       IF x=0 THEN
  2783.         DO
  2784.           SAY '*** Failed to open' bbspath'Lists/Files'CR
  2785.           savefileflag=1
  2786.           RETURN 0
  2787.         END
  2788.       CALL WRITELN(f,filenum files.filenum)
  2789.       CALL CLOSE(f)
  2790.       IF EXISTS(bbspath'Lists/Files.ALPHA') THEN
  2791.         x=listOPEN(f,bbspath'Lists/Files.ALPHA','A')
  2792.       ELSE x=listOPEN(f,bbspath'Lists/Files.ALPHA','W')
  2793.       IF x=0 THEN
  2794.         DO
  2795.           SAY '*** Failed to open' bbspath'Lists/Files.ALPHA'CR
  2796.           RETURN 0
  2797.         END
  2798.       CALL WRITELN(f,alpha.newcount)
  2799.       CALL CLOSE(f)
  2800.       sortalphaflag=1
  2801.       CALL cleanline(1)
  2802.     END
  2803. END
  2804. RETURN 0
  2805.  
  2806.  
  2807. checkfilechanges:
  2808. x=GETCLIP('BBS_FileChange')
  2809. CALL SETCLIP('BBS_FileChange')
  2810. DO ii=1 TO WORDS(x)
  2811.   fnum=WORD(x,ii)
  2812.   keywords=GETCLIP('BBS_Keywords_'fnum)
  2813.   CALL SETCLIP('BBS_Keywords_'fnum)
  2814.   num=files.fnum.0
  2815.   alpha.num=TRIM(OVERLAY(keywords,alpha.num,47,32))
  2816.   sortalphaflag=1
  2817. END
  2818. RETURN
  2819.  
  2820.  
  2821. edkeywords:
  2822. PARSE ARG kwarg
  2823. templine=''
  2824. DO WHILE LENGTH(templine)<3
  2825.   SAY CR
  2826.   SAY pen3'Please enter a list of keywords (or a condensed description)'def||CR
  2827.   SAY pen3'to be used in the alphabetic list and by the search routine.'def||CR
  2828.   SAY '    Note that only the first 32 characters will be used.'CR
  2829.   SAY LEFT('',43)'|'LEFT('',31,'=')'|'CR
  2830.   templine=getinput(0 0 ' 'RIGHT(STRIP(RIGHT(kwarg,32)),32) pen3'KeyWords: 'def)
  2831.   templine=cleanstring('0:'templine)
  2832.   templine=STRIP(LEFT(templine,32))
  2833.   SAY CR
  2834. END
  2835. RETURN templine
  2836.  
  2837.  
  2838. loadfiles:
  2839. SAY def||CR
  2840. IF ~listOPEN(f,bbspath'Lists/Files','R') THEN RETURN
  2841. SAY 'Loading filelist...'CR
  2842. files.=''
  2843. files.0=0
  2844. DO i=1
  2845.   line=READLN(f)
  2846.   IF EOF(f) THEN BREAK
  2847.   num=WORD(line,1)
  2848.   IF DATATYPE(num,'W') THEN
  2849.     DO
  2850.       IF num<100 THEN
  2851.         IF LEFT(WORD(line,3),1)~='.' THEN
  2852.           DO
  2853.             CALL CLOSE(f)
  2854.             SAY CR
  2855.             SAY 'Your filelists need to be renumbered, running bbsUPDATE.rexx...'CR
  2856.             CALL bbsUPDATE.rexx()
  2857.             SIGNAL RESET
  2858.           END
  2859.       files.num=WORD(line,2) WORD(line,3)
  2860.     END
  2861. END
  2862. files.0=i-1
  2863. CALL CLOSE(f)
  2864. RETURN
  2865.  
  2866.  
  2867. savefilelist:
  2868. IF level=99 THEN
  2869.   IF getinput(1 1 'Update filelists now? (nY) > ')='N' THEN RETURN
  2870.  
  2871. savefilelist2:
  2872. SIGNAL OFF BREAK_E
  2873. CALL savealphalist()
  2874. filenum=countcheck('Numbers/LastFile' 0)
  2875. IF filenum<1 THEN
  2876.   DO
  2877.     IF lastfile>0 THEN filenum=lastfile+100
  2878.     ELSE RETURN
  2879.   END
  2880. xarg=bbspath'Lists/Files'
  2881. IF ~listOPEN(f,xarg,'W') THEN RETURN
  2882. SAY 'Saving filelist...'CR
  2883. savefileflag=0
  2884. DO i=1 TO filenum
  2885.   IF files.i~='' THEN CALL WRITELN(f,i files.i)
  2886. END
  2887. CALL CLOSE(f)
  2888. IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  2889. RETURN
  2890.  
  2891.  
  2892. loadalpha:
  2893. ARG alflag
  2894. SAY def||CR
  2895. IF alflag THEN CALL checkliblists()
  2896. IF liblist='' THEN alflag=0
  2897. IF ~listOPEN(f,bbspath'Lists/Files.ALPHA','R') THEN RETURN
  2898. SAY 'Loading the alphabetical filelist...'CR
  2899. alpha.=''
  2900. alpha.0=0
  2901. DO i=1
  2902.   line=READLN(f)
  2903.   IF EOF(f) THEN LEAVE i
  2904.   fnum=WORD(line,3)
  2905.   IF DATATYPE(fnum,'W') THEN
  2906.     DO
  2907.       alpha.i=line
  2908.       files.fnum.0=i
  2909.       IF alflag THEN CALL updateliblists()
  2910.     END
  2911.   ELSE i=i-1
  2912. END
  2913. CALL CLOSE(f)
  2914. tf=bbspath'Lists/Files.ALPHA.add'
  2915. IF EXISTS(tf) & ~SHOW('P','BBSFILE') THEN
  2916.   IF readopen(tf) THEN
  2917.     DO
  2918.       DO i=i
  2919.         line=READLN(f)
  2920.         IF EOF(f) THEN LEAVE i
  2921.         fnum=WORD(line,3)
  2922.         IF DATATYPE(fnum,'W') THEN
  2923.           DO
  2924.             alpha.i=line
  2925.             files.fnum.0=i
  2926.           END
  2927.         ELSE i=i-1
  2928.         IF alflag THEN CALL updateliblists()
  2929.       END
  2930.       CALL CLOSE(f)
  2931.       CALL DELETE(tf)
  2932.       CALL SETCLIP('BBS_resave_local',1)
  2933.     END
  2934. alpha.0=i-1
  2935. IF alflag THEN CALL closeliblists()
  2936. DO i=1 TO 99
  2937.   IF dirs.i='' THEN ITERATE i
  2938.   dname='.'STRIP(LEFT(dirs.i,15))
  2939.   IF files.i='' THEN
  2940.     DO
  2941.       files.i=dirs.i dname
  2942.       files.0=files.0+1
  2943.     END
  2944.   sz=WORD(STATEF(libpath||dirs.i'/'dname),2)
  2945.   IF ~DATATYPE(sz,'W') THEN sz=0
  2946.   x=files.i.0
  2947.   IF ~DATATYPE(x,'W') THEN
  2948.     DO
  2949.       x=alpha.0+1
  2950.       files.i.0=x
  2951.       alpha.0=x
  2952.       CALL SETCLIP('BBS_resave',1)
  2953.       CALL DELETE(libpath||dirs.i'/'dname)
  2954.     END
  2955.   alpha.x=LEFT(dname,22-LENGTH(sz)) sz RIGHT(i,5) RIGHT(i,2)
  2956.   alpha.x=alpha.x LEFT(dirs.i,12) 'alphabetical files list CONTENTS'
  2957. END
  2958. IF GETCLIP('BBS_resave')=1 THEN
  2959.   DO
  2960.     CALL SETCLIP('BBS_resave')
  2961.     sortalphaflag=1
  2962.     CALL savefilelist2()
  2963.   END
  2964. IF alpha.0<files.0 THEN buildalpha=1
  2965. SAY CR
  2966. RETURN
  2967.  
  2968.  
  2969. savealphalist:
  2970. SIGNAL OFF BREAK_E
  2971. IF GETCLIP('BBS_localfiles')~='' THEN
  2972.   DO
  2973.     CALL SETCLIP('BBS_localfiles')
  2974.     CALL loadfiles()
  2975.     CALL loadalpha(0)
  2976.   END
  2977. CALL checkliblists()
  2978. IF sortalphaflag=1 THEN
  2979.   DO
  2980.     SAY 'Alphabetizing' alpha.0 'files...'CR
  2981.     IF alpha.0>0 THEN CALL QSORT(1,alpha.0,alpha)
  2982.     DO i=1 TO alpha.0
  2983.       fnum=WORD(alpha.i,3)
  2984.       files.fnum.0=i
  2985.     END
  2986.   END
  2987. sortalphaflag=0
  2988. IF files.100~='' THEN
  2989.   DO
  2990.     sz=WORD(STATEF(libpath||WORD(files.100,1)'/'WORD(files.100,2)),2)
  2991.     IF DATATYPE(sz,'W') THEN
  2992.       DO
  2993.         anum=files.100.0
  2994.         alpha.anum=OVERLAY(RIGHT(sz,7),alpha.anum,17,7)
  2995.       END
  2996.   END
  2997. IF files.101~='' THEN
  2998.   DO
  2999.     sz=WORD(STATEF(libpath||WORD(files.101,1)'/'WORD(files.101,2)),2)
  3000.     IF DATATYPE(sz,'W') THEN
  3001.       DO
  3002.         anum=files.101.0
  3003.         alpha.anum=OVERLAY(RIGHT(sz,7),alpha.anum,17,7)
  3004.       END
  3005.   END
  3006. IF ~listOPEN(f,bbspath'Lists/Files.ALPHA','W') THEN RETURN
  3007. SAY 'Saving alphabetical filelists...'CR
  3008. DO i=1 TO alpha.0
  3009.   ii=WORD(alpha.i,3)
  3010.   IF files.ii='' THEN alpha.i='0 0' ii '100'
  3011.   IF LEFT(alpha.i,4)='0 0 ' THEN ITERATE i
  3012.   CALL WRITELN(f,alpha.i)
  3013.   IF liblist~='' THEN CALL updateliblists()
  3014. END
  3015. CALL CLOSE(f)
  3016. CALL closeliblists()
  3017. CALL bbsALPHA.rexx(files.0 SUBSTR(extension,2) arccom)
  3018. DO i=0 TO 1
  3019.   t=GETCLIP('BBS_10'i)
  3020.   IF t='' THEN ITERATE i
  3021.   CALL SETCLIP('BBS_10'i)
  3022.   num=100+i
  3023.   files.num=TRANSLATE(t,,'/')
  3024.   files.0=files.0+1
  3025.   x=alpha.0+1
  3026.   files.num.0=x
  3027.   alpha.0=x
  3028.   sz=WORD(STATEF(libpath||t),2)
  3029.   IF ~DATATYPE(sz,'W') THEN sz=0
  3030.   dnum=finddirnum(WORD(files.num,1))
  3031.   alpha.x=LEFT(WORD(files.num,2),22-LENGTH(sz)) sz '  'num RIGHT(dnum,2)
  3032.   alpha.x=alpha.x LEFT(dirs.dnum,12)
  3033.   IF i THEN alpha.x=alpha.x 'alphabetical files list CONTENTS'
  3034.   ELSE alpha.x=alpha.x 'alphabetical by library CONTENTS'
  3035.   SAY 'Added file' num t 'to the filelists.'CR
  3036.   SAY 'Must now resort and resave.'CR
  3037.   CALL SETCLIP('BBS_resave',1)
  3038. END
  3039. RETURN
  3040.  
  3041.  
  3042. listOPEN:
  3043. PARSE ARG fh,listfile,flag
  3044. DO i=0 TO 59 WHILE OPEN(fh,listfile,flag)=0
  3045.   IF i//4=0 THEN SAY 'Waiting' (60-i)*5 'more seconds for' listfile 'to become available...'CR
  3046.   CALL DELAY(250)
  3047. END
  3048. IF i>59 THEN
  3049.   DO
  3050.     line='*** unable to access' listfile 'list.'
  3051.     SAY line||CR
  3052.     CALL send2log(line TIME())
  3053.     RETURN 0
  3054.   END
  3055. RETURN 1
  3056.  
  3057.  
  3058. checkliblists:
  3059. SAY 'Checking individual library filelists...'CR
  3060. liblist=''
  3061. lastlib=0
  3062. cnt.=0
  3063. DO i=1 TO 99
  3064.   IF dirs.i='' THEN ITERATE i
  3065.   finfo=STATEF(libpath||dirs.i'/.'STRIP(LEFT(dirs.i,15)))
  3066.   IF finfo='' THEN liblist=liblist i
  3067.   ELSE
  3068.     DO
  3069.       sz=WORD(finfo,2)
  3070.       num=files.i.0
  3071.       IF DATATYPE(num,'W') THEN
  3072.         alpha.num=OVERLAY(RIGHT(sz,7),alpha.num,17,7)
  3073.     END
  3074. END
  3075. liblist=STRIP(liblist)
  3076. DO j=1 TO WORDS(liblist)
  3077.   tt=WORD(liblist,j)
  3078.   CALL MAKEDIR(libpath||dirs.tt)
  3079.   lf1=libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15))
  3080.   flg='W'
  3081.   IF EXISTS(libpath||dirs.tt'.txt') THEN
  3082.     DO
  3083.       ADDRESS COMMAND 'COPY' libpath||dirs.tt'.txt' lf1
  3084.       flg='A'
  3085.     END
  3086.   IF listOPEN(f,lf1,flg)=0 THEN ITERATE j
  3087.   IF flg='A' THEN CALL WRITELN(f,'')
  3088.   CALL WRITELN(f,'Filename          Bytes File# Library         KeyWords')
  3089.   CALL WRITELN(f,LEFT('=',77,'='))
  3090.   CALL CLOSE(f)
  3091. END
  3092. RETURN
  3093.  
  3094.  
  3095. updateliblists:
  3096. x=FIND(liblist,WORD(alpha.i,4))
  3097. IF x=0 THEN RETURN
  3098. tt=WORD(liblist,x)
  3099. IF tt~=lastlib THEN
  3100.   DO
  3101.     CALL CLOSE(a)
  3102.     lastlib=tt
  3103.     x=OPEN(a,libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)),'A')
  3104.     IF x=0 THEN
  3105.       DO
  3106.         lastlib=0
  3107.         RETURN
  3108.       END
  3109.   END
  3110. CALL WRITELN(a,alpha.i)
  3111. cnt.tt=cnt.tt+1
  3112. RETURN
  3113.  
  3114.  
  3115. closeliblists:
  3116. CALL CLOSE(a)
  3117. DO i=1 TO WORDS(liblist)
  3118.   tt=WORD(liblist,i)
  3119.   dname='.'STRIP(LEFT(dirs.tt,15))
  3120.   SAY ' 'dname||CR
  3121.   x=OPEN(f,libpath||dirs.tt'/'dname,'A')
  3122.   IF x~=0 THEN
  3123.     DO
  3124.       CALL WRITELN(f,LEFT('-',77,'-'))
  3125.       temp='file'
  3126.       IF cnt.tt~=1 THEN temp=temp's'
  3127.       temp=cnt.tt temp'.  Last updated' DATE() 'at' TIME('C')
  3128.       temp=temp RIGHT(bbsname,76-LENGTH(temp))
  3129.       CALL WRITELN(f,temp)
  3130.       CALL CLOSE(f)
  3131.     END
  3132.   CALL MAKEDIR(bbspath'FileNotes/'dirs.tt)
  3133.   fnote=bbspath'FileNotes/'dirs.tt'/'dname
  3134.   lynes.=''
  3135.   lynes.0=5
  3136.   x=OPEN(f,fnote,'R')
  3137.   IF x=0 THEN CALL SETCLIP('BBS_resave',1)
  3138.   ELSE
  3139.     DO
  3140.       DO k=1
  3141.         line=READLN(f)
  3142.         IF EOF(f) THEN LEAVE k
  3143.         lynes.k=line
  3144.       END
  3145.       CALL CLOSE(f)
  3146.       lynes.0=k-1
  3147.     END
  3148.   finfo=STATEF(libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)))
  3149.   bt=WORD(finfo,2)
  3150.   dl=WORD(lynes.2,7)
  3151.   IF ~DATATYPE(dl,'W') THEN dl=0
  3152.   lynes.1='File: 'LEFT(tt,5)' KeyWords: alphabetical files list CONTENTS'
  3153.   lynes.2='Name: 'LEFT(dname,27)' Size:' bt 'bytes  Downloads:' dl
  3154.   lynes.3='From: 'LEFT('BBBBS',27)' Date: 'DATE() TIME('C')'  Lib: 'dirs.tt
  3155.   lynes.4=LEFT('',74,'=')
  3156.   IF lynes.5='' THEN
  3157.     lynes.5='Up to the minute alphabetical filelist of the' dirs.tt 'library.'
  3158.   IF writeopen(fnote) THEN
  3159.     DO
  3160.       DO k=1 TO lynes.0
  3161.         CALL WRITELN(f,lynes.k)
  3162.       END
  3163.       CALL CLOSE(f)
  3164.       SAY LEFT(' ',LENGTH(dname)+2)'1B'x'Mupdated.'CR
  3165.     END
  3166. END
  3167. liblist=''
  3168. RETURN
  3169.  
  3170.  
  3171. edituser:
  3172. IF level>0 THEN
  3173.   IF getinput(1 1 'Change ['pen3'U'def']ser data or ['pen3'M'def']essage conference access (mU) > ')='M' THEN
  3174.     DO
  3175.       SAY CR
  3176.       SAY pen3'     - Message Conference Access -'def||CR
  3177.       SAY '[O]ff turns all message conferences OFF.'CR
  3178.       SAY '[R]eset lets you Reset to ''x'' number of messages back.'CR
  3179.       SAY 'Set the last message read by you in ALL message conferences'CR
  3180.       temp=getinput(1 1 ' ['pen3'F'def']irst  ['pen3'L'def']ast  ['pen3'O'def']ff  ['pen3'R'def']eset  ['pen3'Q'def']uit  (florQ) > ')
  3181.       IF POS(temp,'FLOR')=0 THEN RETURN
  3182.       back=0
  3183.       IF temp='R' THEN
  3184.         back=getnumber('Set each conference pointer back how many messages?')
  3185.       SAY 'Resetting...'lineup||CR
  3186.       data.22=''
  3187.       DO i=1 TO level
  3188.         IF temp='F' THEN num=0
  3189.         ELSE IF temp='O' THEN num=-1
  3190.         ELSE
  3191.           DO
  3192.             num=countcheck('Numbers/LastMessage'i 0)-back
  3193.             IF num<1 THEN num=0
  3194.           END
  3195.         data.22=data.22 num
  3196.       END
  3197.       CALL setdata()
  3198.       CALL sortconferences()
  3199.       CALL savedata(1)
  3200.       RETURN
  3201.     END
  3202. new=0
  3203. change=0
  3204. edata.=''
  3205. edname=name
  3206. DO i=0 TO data.0
  3207.   edata.i=data.i
  3208. END
  3209. num=1
  3210. DO WHILE num~='' | edname~=name
  3211.   IF num='' | LEFT(num,1)='Q' THEN
  3212.     DO
  3213.       IF change THEN
  3214.         DO
  3215.           CALL setdata()
  3216.           CALL savedata(1)
  3217.           change=0
  3218.         END
  3219.       IF new THEN
  3220.         DO
  3221.           data.=''
  3222.           DO i=0 TO edata.0
  3223.             data.i=edata.i
  3224.           END
  3225.           name=edname
  3226.           new=0
  3227.         END
  3228.       CALL setdata()
  3229.     END
  3230.   maxnum=10
  3231.   IF edata.20>sysoplevel THEN maxnum=20
  3232.   IF edata.20=99 THEN maxnum=27
  3233.   SAY bak2' 'name' 'def||CR
  3234.   maxlines=21
  3235.   IF maxnum=10 THEN maxlines=20
  3236.   DO i=1 TO maxlines
  3237.     IF i=5 & name~=edname & edata.20<99 THEN ITERATE
  3238.     SAY RIGHT(i,2)||pen3 text.i||def':' data.i||CR
  3239.   END
  3240.   IF edata.20>sysoplevel THEN
  3241.     DO
  3242.       line=LEFT(' ',50)
  3243.       IF name=edname THEN line=line'NEW = Change User.'
  3244.       line=pen3||line||def||lineup
  3245.       SAY line||CR
  3246.     END
  3247.   num=getinput(1 0 'Select Line Number To Edit: ')
  3248.   IF num='NEW' & edata.20>sysoplevel & edname=name THEN    /* select a new user */
  3249.     DO
  3250.       new=1
  3251.       IF change THEN
  3252.         DO
  3253.           CALL setdata()
  3254.           CALL savedata(1)
  3255.         END
  3256.       change=0
  3257.       nufile=bbspath'Lists/NEW_USERS'
  3258.       IF EXISTS(nufile) THEN CALL showtext(nufile 0)
  3259.       savename=name
  3260.       name=getinput(1 0 'New User Name: 'def)
  3261.       name=cleanstring(1':'name)
  3262.       IF loaddata()=0 THEN name=savename
  3263.       IF data.20>=edata.20 THEN
  3264.         DO
  3265.           SAY 'Can''t Edit!' pen3||name def'has an equal or higher level than thee.'
  3266.           name=savename
  3267.           CALL loaddata()
  3268.         END
  3269.     END
  3270.   ELSE IF DATATYPE(num,'W') & num>0 THEN
  3271.     DO
  3272.       IF num>maxnum THEN
  3273.         DO
  3274.           SAY CR
  3275.           SAY pen3'You are not authorized to change that information!'def||CR
  3276.           SAY CR
  3277.         END
  3278.       ELSE
  3279.         DO dummy=1 TO 1
  3280.           IF num=8 THEN
  3281.             DO
  3282.               SAY CR
  3283.               SAY 'Use spaces to separate options.'CR
  3284.               SAY 'If the option word is in line 8, it is ON.'CR
  3285.               SAY 'Valid Options:'CR
  3286.               SAY '        CLEAR  clears screen between pages.'CR
  3287.               SAY '        COLOR  turns ANSI color codes ON.'CR
  3288.               SAY '        MENU   combines all main commands into 1 menu.'CR
  3289.               SAY '        MENUS  splits main commands into 3 menus.'CR
  3290.               SAY '        PHONE  makes your phone number public.'CR
  3291.               SAY '        QUICK  activates offline options. See bbsQUICK.DOC'CR
  3292.               SAY '        STREET makes your street address public.'CR
  3293.               SAY '        TERSE  skips some of the logon procedures.'CR
  3294.               SAY CR
  3295.             END
  3296.           line=RIGHT(num,2)||pen3 text.num||def': '
  3297.           SAY line||data.num||CR
  3298.           temp=getinput(0 0 line)
  3299.           IF temp='' THEN
  3300.             DO
  3301.               IF num=1 | num=4 | num=5 | num=6 | num=7 THEN LEAVE dummy
  3302.               IF num=11 | num=12 | num=13 | num=20 THEN LEAVE dummy
  3303.             END
  3304.           IF num=5 | num=8 THEN temp=UPPER(temp)
  3305.           IF num=20 & DATATYPE(temp,'W') & temp>=edata.20 THEN
  3306.             temp=data.20
  3307.           IF edata.20>sysoplevel & name~=edname THEN line2=name' '
  3308.           ELSE line2=''
  3309.           IF num=21 & name=edname & edata.20<99 THEN LEAVE dummy
  3310.           line=text.num':' data.num pen6'CHANGED TO'def temp
  3311.           CALL send2log(line2||line)
  3312.           data.num=temp
  3313.           SAY line||CR
  3314.           SAY CR
  3315.           change=1
  3316.         END
  3317.     END
  3318. END
  3319. IF change THEN
  3320.   DO
  3321.     CALL setdata()
  3322.     CALL savedata(1)
  3323.   END
  3324. RETURN
  3325.  
  3326.  
  3327. setmsgs:
  3328. IF ~DATATYPE(bbsprefs.25,'W') THEN RETURN
  3329. data.22=''
  3330. data.23=''
  3331. SAY CR
  3332. line='Setting message counters to last'
  3333. IF bbsprefs.25>1 THEN line=line bbsprefs.25 'messages'
  3334. ELSE line=line 'message'
  3335. line=line 'in each conference...'
  3336. SAY line||CR
  3337. DO i=1 TO level
  3338.   num=countcheck('Numbers/LastMessage'i 0)-bbsprefs.25
  3339.   IF num<0 | msg.i.0<bbsprefs.25 THEN num=0
  3340.   lastread.i=num
  3341.   data.22=data.22 num
  3342.   data.23=data.23 0
  3343. END
  3344. SAY 'Setting file counter to last file uploaded...'CR
  3345. lastbrowse=countcheck('Numbers/LastFile' 0)
  3346. newfilesdate=DATE('S') TIME()
  3347. RETURN
  3348.  
  3349.  
  3350. getnumber:
  3351. PARSE ARG tprompt
  3352. tnum=getinput(1 0 '  'tprompt' > ')
  3353. mask=COMPRESS(XRANGE(),'0123456789')
  3354. tnum=COMPRESS(tnum,mask)
  3355. IF ~DATATYPE(tnum,'W') THEN tnum=0
  3356. tnum=tnum%1
  3357. IF tnum>0 & tnum<10 THEN tnum='0'tnum
  3358. RETURN tnum
  3359.  
  3360.  
  3361. getbirth:
  3362. data.12=WORD(data.12,1)'  'WORD(data.12,2)'  Birthday:'
  3363. SAY pen3'Birthday Information:'def||CR
  3364. month=getnumber('Please enter the MONTH you were born: (1-12)')
  3365. day=getnumber('Please enter the DAY   you were born: (1-31)')
  3366. year=getnumber('Please enter the YEAR  you were born:       ')
  3367. IF year<100 THEN year=year+1900
  3368. born=year||month||day
  3369. IF born<18750101 | born>(DATE('S')-50000) THEN   /* must be older than 4 */
  3370.   DO
  3371.     born=''
  3372.     IF getinput(1 1 'Would you rather skip this question? (Ny) > ')~='Y' THEN
  3373.       CALL getbirth()
  3374.   END
  3375. data.12=WORD(data.12,1)'  'WORD(data.12,2)'  'WORD(data.12,3)' 'WORD(born,1)
  3376. RETURN
  3377.  
  3378.  
  3379. getname:
  3380. nonstop=0
  3381. CALL showuserlist()
  3382. SAY CR
  3383. waitchar='Q'
  3384. CALL showtext(bbspath'BBS_TEXT/NEW_USER_NAME' 1)
  3385. pline='Your name on'pen3 bbsname def'will be > '
  3386. name=getinput(1 0 pline)
  3387. name=cleanstring(1':'name)
  3388. IF name='' THEN
  3389.   DO
  3390.     name=getinput(1 0 pline)
  3391.     name=cleanstring(1':'name)
  3392.     IF name='' THEN
  3393.       DO
  3394.         SAY 'No name, no entry.  Bye!'CR
  3395.         SIGNAL DONE
  3396.       END
  3397.   END
  3398. IF EXISTS(bbspath'Users/'name) | FIND(exclusion,name)>0 THEN
  3399.   DO
  3400.     SAY 'Sorry! That name is taken. Please try again.'CR
  3401.     RETURN 1
  3402.   END
  3403. IF LENGTH(name)=1 THEN
  3404.   DO
  3405.     SAY 'One letter names are not allowed,' name', please try again.'CR
  3406.     RETURN 1
  3407.   END
  3408. IF getinput(1 1 'Your name on'pen3 bbsname def'will be >' name', is that correct? (nY) > ')='N' THEN
  3409.   RETURN 1
  3410. RETURN 0
  3411.  
  3412.  
  3413. /** see if name is in data */
  3414.  
  3415. checkUser:
  3416. tries=0
  3417. IF name='NEW' THEN
  3418.   DO
  3419.     name=''
  3420.     DO WHILE getname()
  3421.     END
  3422.     CALL postuser(7)
  3423.   END
  3424. IF ~EXISTS(bbspath'Users/'name) THEN
  3425.   DO
  3426.     IF EXISTS(bbspath'BBS_TEXT/NEW') THEN
  3427.       DO
  3428.         nonstop=0
  3429.         CALL showtext(bbspath'BBS_TEXT/NEW' 1)
  3430.       END
  3431.     SAY CR
  3432.     IF getinput(1 1 'Do you want to register? (nY) > ')='N' THEN
  3433.       DO
  3434.         SAY 'Thanks anyway, bye!'CR
  3435.         line=name 'did not want to register.'
  3436.         SIGNAL OUT2
  3437.       END
  3438.     defile=bbspath'BBS_TEXT/DEF.NEW_USER'
  3439.     CALL loadcourtesy()
  3440.     wordnum=FIND(courtesy,name)
  3441.     IF wordnum>0 THEN
  3442.       DO
  3443.         SAY name', is on the Courtesy List. You will be granted immediate access.'CR
  3444.         courtesy=STRIP(DELWORD(courtesy,wordnum,1))
  3445.         IF writeopen(bbspath'Lists/Courtesy') THEN
  3446.           DO
  3447.             DO i=1 TO WORDS(courtesy)
  3448.               CALL WRITELN(f,WORD(courtesy,i))
  3449.             END
  3450.             CALL CLOSE(f)
  3451.           END
  3452.         defile=bbspath'BBS_TEXT/DEF.COURTESY'
  3453.       END
  3454.     ELSE IF bbsprefs.7=0 THEN SAY name', You have new user access.'CR
  3455.     IF readlines(defile 1) THEN SIGNAL DONE
  3456.     CALL sound('NEW_USER')
  3457.     data.=''
  3458.     data.0=27
  3459.     DO i=6 TO 22
  3460.       data.i=lynes.i
  3461.     END
  3462.     data.12=DATE('S')'  'TIME('C')
  3463.     data.13=data.12
  3464.     lastondate=DATE('I')-1
  3465.     lastontime=TIME('C')
  3466.     x=FIND(UPPER(data.8),'COLOR')
  3467.     test=getinput(1 1 'Do you see colors ('pen3'ANSI' pen2'C'pen3'O'pen5'L'pen6'O'pen7'R' pen3'codes'def') on this line? (nY) > ')
  3468.     IF test='N' THEN
  3469.       DO
  3470.         IF x>0 THEN data.8=DELWORD(data.8,x,1)
  3471.         CALL colors(0)
  3472.       END
  3473.     ELSE IF x=0 THEN
  3474.       DO
  3475.         data.8=data.8 'COLOR'
  3476.         CALL colors(1)
  3477.       END
  3478.     DO i=60 TO 2 BY -1
  3479.       SAY RIGHT('- 'i' -',14)||CR
  3480.     END
  3481.     data.7=getinput(1 0 'What number is now at the top of your screen? > ')
  3482.     IF data.7<17 | data.7>75 THEN data.7=20
  3483.     SAY 'Please enter the password you would like to use here.'CR
  3484.     data.5=getinput(1 0 'Enter Password: ')
  3485.     DO WHILE getinput(1 1 'Your password on' bbsname 'will be :' data.5 ', is that correct? (nY) > ')='N'
  3486.       data.5=getinput(1 0 'Enter Password: ')
  3487.     END
  3488.     IF data.5='' THEN
  3489.       DO
  3490.         line=name 'refused to enter a password.'
  3491.         SIGNAL DONE
  3492.       END
  3493.     data.1=''
  3494.     DO WHILE data.1=''
  3495.       data.1=getinput(0 0 'Full (real) Name: ')
  3496.       IF data.1='' THEN SAY 'You MUST leave your real name!'CR
  3497.     END
  3498.     data.2=getinput(0 0 'Street: ')
  3499.     data.3=getinput(0 0 'City, State Zip: ')
  3500.     data.4=''
  3501.     DO WHILE data.4=''
  3502.       data.4=getinput(0 0 'Voice Phone (including areacode): ')
  3503.       IF data.4='' THEN
  3504.         SAY sysop 'MUST be able to reach you by phone to validate you!'CR
  3505.     END
  3506.     CALL getbirth()
  3507.     IF bbsprefs.8 THEN
  3508.       DO
  3509.         newufile=bbspath'Lists/NEW_USERS'
  3510.         IF EXISTS(newufile) THEN ok=OPEN(f,newufile,'A')
  3511.         ELSE
  3512.           DO
  3513.             ok=OPEN(f,newufile,'W')
  3514.             IF ok~=0 THEN CALL WRITELN(f,'*** New Users ***')
  3515.           END
  3516.         IF ok~=0 THEN
  3517.           DO
  3518.             temp=RIGHT(TIME('C'),7) COMPRESS(DATE())
  3519.             temp=temp LEFT(name,24)'=' data.1'  'data.4
  3520.             CALL WRITELN(f,temp) 
  3521.           END
  3522.         CALL CLOSE(f)
  3523.       END
  3524.     data.9=getinput(0 0 'Computer: ')
  3525.     data.10=getinput(0 0 'Interests: ')
  3526.     test=getinput(1 1 pen3'Do you want other users to see your STREET address? (Ny) > 'def)
  3527.     IF test='Y' THEN data.8=data.8 'STREET'
  3528.     test=getinput(1 1 pen3'Do you want other users to see your PHONE number? (Ny) > 'def)
  3529.     IF test='Y' THEN data.8=data.8 'PHONE'
  3530.     IF bbsprefs.7>0 THEN
  3531.       DO
  3532.         data.20=bbsprefs.7
  3533.         CALL do_eleven(60 bbsprefs.16 bbsprefs.16-1)
  3534.       END
  3535.     SAY CR
  3536.     CALL setdata()
  3537.     IF data.20=0 THEN
  3538.       SAY 'Thank you, the sysop will give you higher access soon.'CR
  3539.     ELSE CALL setmsgs()
  3540.     SAY CR
  3541.     SAY 'Please feel free to leave additional info by using [C]omment.'CR
  3542.     SAY CR
  3543.     CALL savedata(1)
  3544.     SAY 'Adding' name 'to the user list...'CR
  3545.     newpassword=data.5
  3546.     sortuserflag=1
  3547.     temp=countcheck('Numbers/Users' 0)+1
  3548.     CALL countcheck('Numbers/Users' temp)
  3549.   END
  3550. ELSE
  3551.   DO
  3552.     IF loaddata()=0 THEN SIGNAL DONE
  3553.     city=docity(data.3)
  3554.     PARSE VAR data.11 amins . . . ttimes . . . atimes .
  3555.     lastondate=DATE('I',WORD(data.13,1),'S')
  3556.     lastontime=WORD(data.13,2)
  3557.     IF DATE('I')>lastondate | level>=sysoplevel THEN atimes=ttimes
  3558.     IF level=99 THEN amins=120
  3559.     data.13=DATE('S')'  'TIME()
  3560.     CALL do_eleven(amins ttimes atimes-1)
  3561.     IF atimes<1 & DATE('I')=lastondate THEN
  3562.       DO
  3563.         SAY CR
  3564.         SAY CR
  3565.         line= 'Too many calls today.   Call tomorrow.'
  3566.         SAY line||CR
  3567.         SAY CR
  3568.         SAY CR
  3569.         CALL send2log(line)
  3570.         IF atimes<(-1) THEN SIGNAL LOGOUT2
  3571.         ELSE SIGNAL LOGOUT
  3572.       END
  3573.     data.13=DATE('S')'  'TIME('C')
  3574.     SAY CR
  3575.     SAY pen3'Password will'def 'NOT' pen3'be echoed.'def||CR
  3576.     SAY CR
  3577.     passprompt='Enter Password: '
  3578.     DO tries=1 TO 3
  3579.       Send passprompt
  3580.       Remote OFF
  3581.       OPTIONS PROMPT ''
  3582.       newpassword=getinput(1 0 '')
  3583.       Remote ON
  3584.       IF(password=newpassword) THEN
  3585.         DO
  3586.           SAY ''CR
  3587.           LEAVE tries; /* correct password */
  3588.         END
  3589.       IF tries=3 THEN
  3590.         DO             /* 3 tries, hang up */
  3591.           SAY ''CR
  3592.           SAY 'Access terminated.'CR
  3593.           line='*** Bad password ***' newpassword '***'
  3594.           SAY line||CR
  3595.           city=line
  3596.           CALL postuser(6)
  3597.           SIGNAL OUT2
  3598.         END
  3599.       SAY ''lineup'                                 'CR
  3600.       passprompt='Incorrect.  Password: ' /* ask again */
  3601.     END
  3602.   END
  3603. SAY CR
  3604. IF bbsprefs.23=1 THEN
  3605.   ADDRESS AREXX bbsSpeak.rexx 'LOGON' name bbspath saypath
  3606. RETURN
  3607.  
  3608.  
  3609. do_eleven:
  3610. ARG am tc at .
  3611. data.11=am 'minutes per call,' tc 'calls per day,'
  3612. data.11=data.11 at 'more calls today'
  3613. RETURN
  3614.  
  3615.  
  3616. savedata:
  3617. ARG messflag .
  3618. IF data.5='' THEN RETURN
  3619. temp=GETCLIP(name'_UPDATE')
  3620. IF temp~='' THEN
  3621.   DO
  3622.     CALL SETCLIP(name'_UPDATE')
  3623.     PARSE VAR temp upfiles' 'upbytes' 'upmail' 'upmsg
  3624.     IF upfiles>0 THEN
  3625.       DO
  3626.         files=WORD(data.14,1)
  3627.         bytes=WORD(data.14,3)
  3628.         IF DATATYPE(files,'W') THEN upfiles=upfiles+files
  3629.         IF DATATYPE(bytes,'W') THEN bytes=upbytes
  3630.         data.14=upfiles 'files' bytes 'bytes.' DATE()
  3631.       END
  3632.     IF upmail>0 THEN
  3633.       DO
  3634.         mail=WORD(data.17,2)
  3635.         IF DATATYPE(mail,'W') THEN upmail=upmail+mail
  3636.         data.17=WORD(data.17,1) upmail WORD(data.17,3)
  3637.       END
  3638.     IF upmsg~='' THEN
  3639.       DO
  3640.         temp=data.23
  3641.         DO i=1 TO level
  3642.           smsg=WORD(temp,i)
  3643.           IF ~DATATYPE(smsg,'W') THEN smsg=0
  3644.           IF FIND(upmsg,i) THEN smsg=smsg+1
  3645.           data.23=data.23 smsg
  3646.         END
  3647.       END
  3648.   END
  3649. SAY 'Updating...             'lineup||CR
  3650. SIGNAL OFF BREAK_E
  3651. Status Trans
  3652. data.6=STRIP(RESULT)
  3653. IF newfilesdate~='' THEN data.16=lastbrowse newfilesdate
  3654. ELSE IF lastbrowse>0 THEN
  3655.   DO
  3656.     IF WORDS(data.16)>1 THEN data.16=DELWORD(data.16,1,1)
  3657.     ELSE data.16=DATE('S') TIME()
  3658.     data.16=lastbrowse data.16
  3659.   END
  3660. IF DATATYPE(winnings,'N') THEN data.18=winnings
  3661. ELSE data.18=0
  3662. IF messflag THEN
  3663.   DO
  3664.     userexclude.=0
  3665.     DO si=1 TO WORDS(data.22)
  3666.       IF WORD(data.22,si)=-1 THEN userexclude.si=1
  3667.     END
  3668.     data.22=''
  3669.     data.23=''
  3670.     DO si=1 TO level
  3671.       IF ~DATATYPE(lastread.si,'W') THEN lastread.si=0
  3672.       IF userexclude.si THEN data.22=data.22 '-1'
  3673.       ELSE data.22=data.22 lastread.si
  3674.       IF ~DATATYPE(totwrit.si,'W') THEN totwrit.si=0
  3675.       data.23=data.23 totwrit.si
  3676.     END
  3677.   END
  3678. IF writeopen(bbspath'USERS/'name)=0 THEN RETURN
  3679. IF data.0<27 THEN data.0=27
  3680. DO i=1 TO data.0
  3681.   CALL WRITELN(f,data.i)
  3682. END
  3683. CALL CLOSE(f)
  3684. SAY 'User' name 'has been updated.'CR
  3685. RETURN
  3686.  
  3687.  
  3688. loaddata:
  3689. IF name='' THEN RETURN 0
  3690. IF ~readopen(bbspath'USERS/'name) THEN RETURN 0
  3691. data.=''
  3692. DO i=1
  3693.   line=READLN(f)
  3694.   IF EOF(f) THEN BREAK
  3695.   data.i=line
  3696. END
  3697. data.0=i-1
  3698. CALL CLOSE(f)
  3699. winnings=WORD(data.18,1)
  3700. IF ~DATATYPE(winnings,'N') THEN winnings=0
  3701.  
  3702. setdata:
  3703. IF WORDS(data.16)<3 THEN data.16='0 19900101 00:00:00'
  3704. lastbrowse=WORD(data.16,1)
  3705. IF ~DATATYPE(lastbrowse,'W') THEN lastbrowse=0
  3706. level=data.20
  3707. DO i=1 TO level
  3708.   lastread.i=WORD(data.22,i)
  3709.   IF ~DATATYPE(lastread.i,'W') THEN lastread.i=0
  3710.   totwrit.i=WORD(data.23,i)
  3711.   IF ~DATATYPE(totwrit.i,'W') THEN totwrit.i=0
  3712. END
  3713. password=data.5
  3714. IF data.6='' THEN
  3715.   DO
  3716.     Status Trans
  3717.     data.6=RESULT
  3718.   END
  3719. ELSE
  3720.   DO
  3721.     IF RIGHT(UPPER(data.6),2)='-G' THEN data.6='G'
  3722.     IF RIGHT(UPPER(data.6),3)='-1K' THEN data.6='K'
  3723.     IF LEFT(UPPER(data.6),1)='A' THEN data.6='Z'
  3724.     Set UPPER(LEFT(data.6,1))
  3725.   END
  3726. IF ~DATATYPE(data.7,'W') THEN data.7=20
  3727. IF data.7<5 THEN data.7=5
  3728. linesperpage=data.7
  3729. IF FIND(UPPER(data.8),'TERSE')>0 THEN terseflag=1
  3730. ELSE terseflag=0
  3731. IF FIND(UPPER(data.8),'COLOR')>0 THEN colorflag=1
  3732. ELSE colorflag=0
  3733. CALL colors(colorflag)
  3734. IF FIND(UPPER(data.8),'CLEAR')>0 THEN clr='0C'x
  3735. ELSE clr=''
  3736. menu='ALL'
  3737. IF FIND(UPPER(data.8),'MENUS')>0 THEN
  3738.   DO
  3739.     menuflag=1
  3740.     menu='MAIN'
  3741.   END
  3742. ELSE IF FIND(UPPER(data.8),'MENU')>0 THEN menuflag=1
  3743. ELSE menuflag=0
  3744. IF level=0 THEN menu='NEW'
  3745. IF DATATYPE(WORD(data.11,3),'W') THEN
  3746.   DO
  3747.     PARSE VAR data.11 amins . atimes .
  3748.     CALL do_eleven(amins bbsprefs.16 atimes)
  3749.   END
  3750. data.21=UPPER(data.21)
  3751. maxtime=WORD(data.11,1)*60
  3752. CALL MAKEDIR(bbspath'Friends')
  3753. alias.=''
  3754. alias.0=0
  3755. realname.=''
  3756. CALL CLOSE(f)
  3757. IF OPEN(f,bbspath'Friends/'name,'R')=0 THEN RETURN 1
  3758. DO i=1
  3759.   line=READLN(f)
  3760.   IF EOF(f) THEN LEAVE i
  3761.   alias.i=WORD(line,1)
  3762.   realname.i=WORD(line,2)
  3763. END
  3764. alias.0=i-1
  3765. CALL CLOSE(f)
  3766. RETURN 1
  3767.  
  3768.  
  3769. switchmenuflag:
  3770. IF menuflag=1 THEN
  3771.   DO
  3772.     menuflag=0
  3773.     noff='OFF'
  3774.   END
  3775. ELSE
  3776.   DO
  3777.     menuflag=1
  3778.     noff='ON'
  3779.   END
  3780. SAY 'Menus turned' pen3||noff||def'.'CR
  3781. SAY 'To make a permanent change, add or delete MENU(S) from [Y]our userdata item 8.'CR
  3782. RETURN
  3783.  
  3784.  
  3785. switchcolors:
  3786. IF colorflag=1 THEN
  3787.   DO
  3788.     colorflag=0
  3789.     noff='OFF'
  3790.   END
  3791. ELSE
  3792.   DO
  3793.     colorflag=1
  3794.     noff='ON'
  3795.   END
  3796. CALL colors(colorflag)
  3797. SAY 'Color turned' pen3||noff||def'.'CR
  3798. SAY 'To make a permanent change, add or delete COLOR from [Y]our userdata item 8.'CR
  3799. RETURN
  3800.  
  3801.  
  3802. /* ANSI pen color codes */
  3803. colors:
  3804. ARG onoff
  3805. IF onoff THEN
  3806.   DO
  3807.     def='';  /* default */
  3808.     pen0='';  pen1='';  pen2='';  pen3=''
  3809.     pen4='';  pen5='';  pen6='';  pen7=''
  3810.     bak0='';  bak1='';  bak2='';  bak3=''
  3811.     bak4='';  bak5='';  bak6='';  bak7=''
  3812.   END
  3813. ELSE
  3814.   DO
  3815.     pen0=''; pen1=''; pen2=''; pen3=''; pen4=''; pen5=''; pen6=''; pen7=''
  3816.     bak0=''; bak1=''; bak2=''; bak3=''; bak4=''; bak5=''; bak6=''; bak7=''
  3817.     def=''
  3818.   END
  3819. RETURN
  3820.  
  3821.  
  3822. chpro:
  3823. arg=UPPER(LEFT(arg,1))
  3824. IF(arg='') THEN
  3825.   DO
  3826.     SAY CR
  3827.     SAY '['pen3'W'def']- WXModem'CR
  3828.     SAY '['pen3'X'def']- XModem-CRC'CR
  3829.     SAY '['pen3'K'def']- XModem-1K'CR
  3830.     SAY '['pen3'Y'def']- YModem'CR
  3831.     SAY '['pen3'G'def']- YModem-G'CR
  3832.     SAY '['pen3'Z'def']- ZModem'CR
  3833.     SAY CR
  3834.     arg=getinput(1 0 STRIP(protocol) '> ')
  3835.  END
  3836. IF LEFT(UPPER(arg),1)='A' THEN arg='Z'
  3837. Set arg
  3838. Status Transfer
  3839. protocol=STRIP(RESULT)
  3840. SAY protocol||CR
  3841. RETURN
  3842.  
  3843.  
  3844. sortinfofiles:
  3845. infolist=SHOWDIR(bbspath'Information')
  3846. IF infolist='' THEN
  3847.   DO
  3848.     SAY CR
  3849.     SAY pen3'No files are currently in the Information drawer.'def||CR
  3850.     SAY CR
  3851.     RETURN 1
  3852.   END
  3853. IF ~DATATYPE(sortinfo.0,'W') THEN
  3854.   DO
  3855.     info.=''
  3856.     sortinfo.=''
  3857.     info.0=WORDS(infolist)
  3858.     DO i=1 TO info.0
  3859.       info.i=WORD(infolist,i)
  3860.     END
  3861.     SAY 'Sorting..'CR
  3862.     IF info.0>0 THEN CALL QSORT(1,info.0,info)
  3863.     sortinfo.0=info.0%3
  3864.     IF (info.0//3)>0 THEN sortinfo.0=sortinfo.0+1
  3865.     DO i=1 TO sortinfo.0
  3866.       sortinfo.i=''
  3867.       DO j=0 TO 2
  3868.         k=i+j*sortinfo.0
  3869.         IF k<=info.0 THEN
  3870.           DO
  3871.             sortinfo.i=sortinfo.i RIGHT(k,3)'.' LEFT(info.k,19)
  3872.             infocount=WORD(STATEF(bbspath'Information/'info.k),8)
  3873.             sortinfo.i.0=sortinfo.i.0||RIGHT(infocount,5) LEFT(info.k,19)
  3874.           END
  3875.       END
  3876.     END
  3877.     SAY lineup'         'lineup||CR
  3878.   END
  3879. RETURN 0
  3880.  
  3881.  
  3882. information:
  3883. IF sortinfofiles() THEN RETURN
  3884. CALL sound('INFO')
  3885. num=1
  3886. readcount=-1
  3887. DO infoloop=1
  3888.   CALL postfour('   Information: Menu')
  3889.   IF num=0 THEN
  3890.     DO
  3891.       IF readcount~=-1 THEN
  3892.         DO
  3893.           sortinfo.0=''
  3894.           IF sortinfofiles() THEN RETURN
  3895.         END
  3896.       SAY CENTER('- Number of accesses per file -',75)||CR
  3897.     END
  3898.   ELSE SAY pen3'These text files are available for reading online...'def||CR
  3899.   SAY pen3||LEFT('-',75,'-')||def||CR
  3900.   DO i=1 TO sortinfo.0
  3901.     IF num=0 THEN SAY sortinfo.i.0||CR
  3902.     ELSE SAY sortinfo.i||CR
  3903.   END
  3904.   SAY pen3||LEFT('-',75,'-')||def||CR
  3905.   CALL checktime()
  3906.   IF num=0 THEN
  3907.     DO
  3908.       CALL waiting()
  3909.       num=1
  3910.       ITERATE infoloop
  3911.     END
  3912.   num=getinput(1 0 pen3'Select Number Of Information File To View. 0=Stats > 'def)
  3913.   IF num=0 THEN ITERATE infoloop
  3914.   IF ~DATATYPE(num,'W') | num<1 | num>info.0 THEN RETURN
  3915.   readcount=STATEF(bbspath'Information/'info.num)
  3916.   readbytes=WORD(readcount,2)
  3917.   SAY '  'info.num 'is' readbytes 'bytes.'CR
  3918.   CALL postfour('Information:' info.num)
  3919.   IF getinput(1 1 '['pen3'R'def']ead or ['pen3'D'def']ownload? (dR) > ')='D' THEN
  3920.     DO
  3921.       allargs=bbspath'Information/'info.num
  3922.       CALL dload2()
  3923.     END
  3924.   ELSE
  3925.     DO
  3926.       SAY 'Loading File...'CR
  3927.       CALL Increment.rexx(bbspath'Information/'info.num)
  3928.       CALL DELAY(28)
  3929.       CALL readlines(bbspath'Information/'info.num 1)
  3930.       CALL cleanline(0)
  3931.       SAY lineup'    'lynes.0 'lines.'CR
  3932.       SAY CR    
  3933.       CALL seelines(0)
  3934.     END
  3935.   CALL showtime()
  3936.   IF waitchar~='Q' THEN CALL waiting()
  3937.   nonstop=0
  3938. END
  3939. RETURN
  3940.  
  3941.  
  3942. newfiles:
  3943. SAY CR
  3944. test=getinput(1 1 'Show one library only? (Ny) > ')
  3945. IF test='Y' THEN
  3946.   IF chdir()>0 THEN RETURN
  3947. SAY 'Searching for new (un-browsed) files since' DATE(,WORD(data.16,2),'S') 'at' WORD(data.16,3)'...'CR
  3948. lastbrowz=WORD(data.16,1)
  3949. lastfile=countcheck('Numbers/LastFile' 0)
  3950.  
  3951. newfiles2:
  3952. IF lastbrowz>=lastfile THEN
  3953.   DO
  3954.     lastbrowz=0
  3955.     SAY pen3'No new files. Listing backwards by date from last file uploaded...'def||CR
  3956.   END
  3957. ELSE newfilesflag=1
  3958. j=0
  3959. IF test='Y' THEN
  3960.   DO
  3961.     filecount=WORDS(SHOWDIR(bbspath'FileNotes/'plaindir))-1
  3962.     CALL busywait(4 1)
  3963.   END
  3964. DO ni=lastfile TO lastbrowz+1 BY -1
  3965.   IF files.ni~='' THEN
  3966.     DO
  3967.       IF test='Y' THEN 
  3968.         DO
  3969.           IF ni>1 THEN CALL busywait(60 ni lastfile-lastbrowz)
  3970.           IF j>=filecount THEN LEAVE ni
  3971.           IF UPPER(LEFT(WORD(files.ni,1),12))~=UPPER(LEFT(plaindir,12)) THEN
  3972.             ITERATE ni
  3973.         END
  3974.       jj=files.ni.0
  3975.       IF WORD(alpha.jj,4)>level | FIND(data.21,UPPER(WORD(files.ni,1)))>0 THEN
  3976.         ITERATE ni  /* unauthorized */
  3977.       IF test='Y' THEN CALL busywait(4 0)
  3978.       j=j+1
  3979.       IF j=1 THEN CALL fileheader()
  3980.       SAY alpha.jj||CR
  3981.       IF (j+2)//(linesperpage-1)=0 THEN
  3982.         IF waiting2() THEN LEAVE ni
  3983.       IF test='Y' THEN CALL busywait(4 1)
  3984.     END
  3985. END
  3986. IF test='Y' THEN CALL busywait(4 0)
  3987. IF j//linesperpage~=0 THEN CALL waiting()
  3988. IF j=0 & newfilesflag=1 THEN
  3989.   DO
  3990.     lastbrowz=999999
  3991.     newfilesflag=0
  3992.     CALL newfiles2()
  3993.   END
  3994. IF test~='Y' THEN
  3995.   DO
  3996.     CALL newinfo()
  3997.     IF lynes.0>0 THEN CALL waiting()
  3998.   END
  3999. nonstop=0
  4000. RETURN
  4001.  
  4002.  
  4003. newinfo:
  4004. lynes.=''
  4005. lynes.0=0
  4006. dm=DATE(,WORD(data.16,2),'S')
  4007. PARSE VAR dm da' 'mo' 'yr .
  4008. yr=RIGHT(yr,2)
  4009. sincedate=da'-'mo'-'yr
  4010. startline=1
  4011. arg=bbspath'Information'
  4012. IF WORD(STATEF(arg),5)>lastondate THEN
  4013.   DO
  4014.     ADDRESS COMMAND 'C:LIST >'scratch'/dirlist' arg 'NOHEAD DATES SINCE' sincedate
  4015.     IF WORD(STATEF(scratch'/dirlist'),2)>3 THEN
  4016.       DO
  4017.         lynes.startline=pen1||bak2' New or Updated Information Files. Enter'def pen3'I'def bak2'from the main menu to read 'def
  4018.         CALL readlines(scratch'/dirlist' startline+1)
  4019.       END
  4020.   END
  4021. arg=bbspath'Profiles'
  4022. IF level>0 & WORD(STATEF(arg),5)>lastondate THEN
  4023.   DO
  4024.     ADDRESS COMMAND 'C:LIST >'scratch'/dirlist' arg 'NOHEAD DATES SINCE' sincedate
  4025.     IF WORD(STATEF(scratch'/dirlist'),2)>3 THEN
  4026.       DO
  4027.         startline=lynes.0+2
  4028.         lynes.startline=pen1||bak2' New or Updated User Profiles. Enter'def pen3'&'def bak2'from the main menu to read 'def
  4029.         CALL readlines(scratch'/dirlist' startline+1)
  4030.       END
  4031.   END
  4032. arg=bbspath'rexxDoors/Data/Polls'
  4033. IF level>0 & WORD(STATEF(arg),5)>lastondate THEN
  4034.   DO
  4035.     startline=lynes.0+2
  4036.     lynes.startline=pen1||bak2' Voting Activity. Enter'def pen3'J'def bak2'from the main menu, then select Polling_Place 'def
  4037.     lynes.0=startline
  4038.   END
  4039. IF logonflag=1 THEN nonstop=1
  4040. IF lynes.0>0 THEN CALL seelines(1)
  4041. nonstop=0
  4042. RETURN
  4043.  
  4044.  
  4045. chdir:
  4046. string=''
  4047. SAY pen3||LEFT('-',75,'-')||def||CR
  4048. DO i=1 TO libs.0
  4049.   SAY libs.i||CR
  4050. END
  4051. SAY pen3||LEFT('-',75,'-')||def||CR
  4052. dirnum=getinput(1 0 pen3'Select Library Number: 'def)
  4053. IF clr~='' THEN Send clr
  4054. IF ~DATATYPE(dirnum,'W') THEN
  4055.   DO
  4056.     waitchar=dirnum
  4057.     RETURN 2
  4058.   END
  4059.  
  4060. chdir2:
  4061. IF dirnum<1 | dirnum>99 THEN
  4062.   DO
  4063.     waitchar=dirnum
  4064.     RETURN 1
  4065.   END
  4066. IF dirs.dirnum='' THEN
  4067.   DO
  4068.     SAY pen3'That library number is currently un-assigned.'def||CR
  4069.     RETURN 1
  4070.   END
  4071. IF dirnum>level | FIND(data.21,UPPER(dirs.dirnum))>0 THEN
  4072.   DO
  4073.     SAY pen3'You do not have authorization for that library!'def||CR
  4074.     RETURN 1
  4075.   END
  4076. td=libpath||dirs.dirnum
  4077. CALL MAKEDIR(td)
  4078. CALL setdir(td)
  4079. IF libtext=0 THEN
  4080.   IF EXISTS(td'/.'STRIP(LEFT(dirs.dirnum,15))) THEN RETURN 0
  4081. t=libpath||plaindir'.txt'
  4082. IF terseflag | ~EXISTS(t) THEN RETURN 0
  4083. nonstop=1
  4084. SAY CR
  4085. CALL readlines(t 1)
  4086. CALL seelines(1)
  4087. SAY CR
  4088. nonstop=0
  4089. RETURN 0
  4090.  
  4091.  
  4092. since:
  4093. dm=DATE(,WORD(data.16,2),'S')
  4094. SAY CR
  4095. SAY 'New files or files moved since' dm||CR
  4096. CALL listsince()
  4097. CALL readlines(scratch'/dirlist' 1)
  4098. CALL seelines(1)
  4099. nonstop=0
  4100. CALL waiting()
  4101. RETURN
  4102.  
  4103.  
  4104. listsince:
  4105. dm=DATE(,WORD(data.16,2),'S')
  4106. PARSE VAR dm da' 'mo' 'yr .
  4107. yr=RIGHT(yr,2)
  4108. sincedate=da'-'mo'-'yr
  4109. ADDRESS COMMAND 'C:list >'scratch'/dirlist' directory 'DATES SINCE' sincedate
  4110. RETURN
  4111.  
  4112.  
  4113. list:
  4114. onetime=0
  4115. IF DATATYPE(arg,'W') THEN onetime=1
  4116. ELSE arg=''
  4117. DO listloop=1
  4118.   IF DATATYPE(arg,'W') THEN
  4119.     DO
  4120.       dirnum=arg
  4121.       arg=''
  4122.       IF chdir2()>0 THEN RETURN
  4123.       CALL listsimple()
  4124.       IF waitchar='Q' | onetime THEN LEAVE listloop
  4125.     END
  4126.   ELSE IF arg='' THEN
  4127.     DO
  4128.       libtext=0
  4129.       IF chdir()>0 THEN
  4130.         DO
  4131.           libtext=1
  4132.           RETURN
  4133.         END
  4134.       test='Y'
  4135.       CALL showalpha2()
  4136.       arg=''
  4137.       IF waitchar='Q' THEN waitchar=''
  4138.       IF waitchar~='' THEN RETURN
  4139.       ITERATE listloop
  4140.     END
  4141.   ELSE RETURN
  4142. END
  4143. RETURN
  4144.  
  4145.  
  4146. listsimple:
  4147. ADDRESS COMMAND 'C:list >'scratch'/dirlist' directory 'DATES'
  4148. IF readlines(scratch'/dirlist' 1) THEN RETURN
  4149. IF lynes.0>3 THEN
  4150.   DO
  4151.     SAY pen3'Sorting...'def||lineup||CR
  4152.     linesave=lynes.1  /* these 4 lines put in to leave dir title at top */
  4153.     lynes.1='0'
  4154.     IF lynes.0>1 THEN CALL QSORT(1,lynes.0-1,lynes)
  4155.     CALL DELAY(14)
  4156.     lynes.1=linesave
  4157.   END
  4158. CALL seelines(1)
  4159. nonstop=0
  4160. CALL waiting()
  4161. RETURN
  4162.  
  4163.  
  4164. browse:
  4165. curdironly=0
  4166. brdir=PRAGMA('D')
  4167. brfilenum=1
  4168. nonstop=0
  4169. IF files.0<1 THEN RETURN
  4170. lastfile=countcheck('Numbers/LastFile' 0)
  4171. IF lastfile<1 THEN RETURN
  4172. CALL postfour('Browse:' arg)
  4173. onearg=0
  4174. IF arg='' THEN
  4175.   DO
  4176.     lin='Browsing'
  4177.     test=getinput(1 1 'Browse one library only? (Ny) > ')
  4178.     IF test='Y' THEN
  4179.       DO
  4180.         IF chdir()>0 THEN RETURN
  4181.         curdironly=1
  4182.         lin=lin 'the' pen3||plaindir||def 'library'
  4183.         t=libpath||plaindir'.txt'
  4184.         IF edinfo(t,plaindir,'File Library') THEN RETURN
  4185.       END
  4186.     ELSE lin=lin 'all file libraries'
  4187.     lin=lin 'backwards from latest file.'
  4188.     SAY lin||CR
  4189.     SAY CR
  4190.   END
  4191. ELSE onearg=1
  4192. i=0
  4193. IF arg='' | UPPER(arg)='NEW' | UPPER(arg)='ALL' THEN
  4194.   DO lastfileloop=1
  4195.     IF lastfile<1 THEN RETURN
  4196.     arg=WORD(files.lastfile,2)
  4197.     brfilenum=lastfile
  4198.     IF WORD(files.lastfile,2)~='' THEN LEAVE lastfileloop
  4199.     lastfile=lastfile-1
  4200.   END
  4201. ELSE IF DATATYPE(arg,'W') THEN
  4202.   DO
  4203.     brfilenum=arg
  4204.     arg=WORD(files.arg,2)
  4205.     IF arg='' THEN
  4206.       DO
  4207.         SAY 'File number' brfilenum 'does not exist in the current libraries!'CR
  4208.         RETURN
  4209.       END
  4210.   END
  4211. ELSE
  4212.   DO
  4213.     IF onearg THEN CALL busywait(4 1)
  4214.     DO ni=lastfile TO 1 BY -1
  4215.       IF onearg THEN CALL busywait(60 ni lastfile)
  4216.       IF UPPER(WORD(files.ni,2))~=UPPER(arg) THEN ITERATE ni
  4217.       brfilenum=ni
  4218.       CALL busywait(4 0)
  4219.       LEAVE ni
  4220.     END
  4221.     IF ni<1 THEN
  4222.       DO
  4223.         SAY 'Unable to find a file description for' pen3||arg||def'.'CR
  4224.         RETURN
  4225.       END
  4226.   END
  4227. IF ~curdironly THEN CALL setdir(libpath||WORD(files.brfilenum,1))
  4228. savearg=arg
  4229. IF brfilenum>lastfile THEN brfilenum=lastfile
  4230. newfilesdate=DATE('S') TIME()
  4231. DO browseloop=1
  4232.   IF curdironly THEN CALL busywait(4 1)
  4233.   DO ni=brfilenum TO 0 BY -1
  4234.     IF ni=0 THEN LEAVE browseloop
  4235.     IF files.ni='' THEN ITERATE ni
  4236.     IF onearg THEN
  4237.       DO
  4238.         CALL busywait(60 ni lastfile)
  4239.         IF UPPER(arg)~=UPPER(WORD(files.ni,2)) THEN ITERATE ni
  4240.         IF (ni//30)>0 THEN CALL busywait(4 1)
  4241.         LEAVE ni
  4242.       END
  4243.     testdir=UPPER(WORD(files.ni,1))
  4244.     IF curdironly & UPPER(plaindir)~=UPPER(testdir) THEN
  4245.       DO
  4246.         IF ni>lastbrowse THEN lastbrowse=ni
  4247.         IF ni>0 THEN CALL busywait(60 ni lastfile)
  4248.         ITERATE ni
  4249.       END
  4250.     IF FIND(data.21,testdir)>0 | finddirnum(testdir)>level THEN
  4251.       DO
  4252.         IF ni>lastbrowse THEN lastbrowse=ni
  4253.         ITERATE ni
  4254.       END
  4255.     LEAVE ni
  4256.   END
  4257.   IF curdironly | onearg THEN CALL busywait(4 0)
  4258.   onearg=0
  4259.   IF ni=0 THEN brfilenum=lastbrowse
  4260.   ELSE brfilenum=ni
  4261.   argname=WORD(files.brfilenum,2)
  4262.   IF argname='' THEN RETURN
  4263.   CALL setdir(libpath||WORD(files.brfilenum,1))
  4264.   arg=bbspath'FileNotes/'plaindir'/'argname
  4265.   CALL readlines(arg 1)
  4266.   IF nonstop=1 THEN brostop=1
  4267.   ELSE brostop=0
  4268.   CALL seelines(1)
  4269.   IF brfilenum>lastbrowse THEN lastbrowse=brfilenum
  4270.   CALL checktime()
  4271.   IF brostop THEN
  4272.     DO
  4273.       SAY CR
  4274.       nonstop=1
  4275.       brfilenum=brfilenum-1
  4276.     END
  4277.   ELSE
  4278.     DO
  4279.       CALL postfour('Browse:' brfilenum plaindir'/'argname)
  4280.       line=''
  4281.       endtest=UPPER(RIGHT(argname,4))
  4282.       IF FIND('.ARC .ARJ .DMS .LZH .LHA .RUN .ZIP .ZOO',endtest)>0 THEN
  4283.         line='['pen3'C'def']ontents ['pen3'D'def']ownload'
  4284.       ELSE line='['pen3'D'def']ownload'
  4285.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4286.         line=line '['pen3'E'def']dit'
  4287.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4288.         line=line '['pen3'K'def']ill'
  4289.       IF level>sysoplevel THEN line=line '['pen3'L'def']ib'
  4290.       line=line '['pen3'M'def']ark ['pen3'N'def']on-Stop'
  4291.       IF endtest='.TXT' | UPPER(argname)='.'UPPER(STRIP(LEFT(plaindir,15))) THEN
  4292.         line=line '['pen3'R'def']ead'
  4293.       line=line '['pen3'Q'def']uit ['pen3'?'def'] > '
  4294.       brcom=getinput(1 0 line)
  4295.       IF DATATYPE(brcom,'W') THEN
  4296.         DO
  4297.           brfilenum=brcom+1
  4298.           IF brfilenum>lastfile THEN brfilenum=lastfile+1
  4299.           IF brfilenum<1 THEN brfilenum=1
  4300.           SAY CR
  4301.         END
  4302.       ELSE brcom=LEFT(brcom,1)
  4303.       CALL cleanline(0)
  4304.       IF brcom='Q' THEN LEAVE browseloop
  4305.       IF brcom='M' THEN
  4306.         DO
  4307.           wordnum=FIND(data.25,brfilenum)
  4308.           IF wordnum=0 THEN
  4309.             DO
  4310.               data.25=STRIP(data.25 brfilenum)
  4311.               SAY lineup||argname 'marked for next download.'CR
  4312.               SAY CR
  4313.             END
  4314.           ELSE
  4315.             DO
  4316.               data.25=STRIP(DELWORD(data.25,wordnum,1))
  4317.               SAY argname 'removed from download list.'CR
  4318.             END
  4319.         END
  4320.       IF brcom='H' | brcom='?' THEN
  4321.         DO
  4322.           SAY pen3' - HELP with the Browse Files commands -'def||CR
  4323.           SAY ' RETURN reads the next file description in line.'CR
  4324.           SAY ' 34 will display the description of file number 34, if it exists.'CR
  4325.           SAY ' C  displays the contents of an archived (arc dms lzh lha zip zoo) file.'CR
  4326.           SAY ' D  displays the download menu.'CR
  4327.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4328.             DO
  4329.           SAY ' E  puts this file description into the online Editor.'CR
  4330.           SAY ' K  deletes a file you uploaded. you cannot Kill others!'CR
  4331.             END
  4332.           IF level>sysoplevel THEN
  4333.           SAY ' L  move file and description to new Library and/or rename.'CR
  4334.           SAY ' M  mark/unmark the current file for the next download'CR
  4335.           SAY ' N  displays all descriptions without pausing. CTRL-E to Exit!'CR
  4336.           SAY ' R  displays file as text. - ONLY FILES THAT END IN .TXT -'CR
  4337.           SAY ' Q  returns to the main menu(s). (Quit)'CR
  4338.           SAY CR
  4339.           CALL waiting()
  4340.           IF waitchar='Q' THEN LEAVE browseloop
  4341.         END
  4342.       ELSE IF brcom='L' & level>sysoplevel THEN
  4343.         DO
  4344.           curdir=PRAGMA('D')
  4345.           IF getinput(1 1 'Rename' argname '? (Ny) > ')='Y' THEN
  4346.             DO
  4347.               newarg=getinput(0 0 'Rename' argname 'to ')
  4348.               IF newarg~='' THEN
  4349.                 DO
  4350.                   IF is_here(newarg) THEN ITERATE browseloop
  4351.                   IF wi=999999 THEN ITERATE browseloop
  4352.                   IF EXISTS(libpath||filedir'/'newarg) THEN
  4353.                     DO
  4354.                       SAY CR
  4355.                       SAY '***' newarg 'already exists!'CR
  4356.                       SAY CR
  4357.                       ITERATE browseloop
  4358.                     END
  4359.                   junk=getinput(1 1 'Are you SURE you want to rename' argname 'to' newarg'? (Ny) ')
  4360.                   IF junk='Y' THEN
  4361.                     DO
  4362.                       lynes.2=OVERLAY(newarg,lynes.2,7,25)
  4363.                       comment=WORD(STATEF(arg),8)
  4364.                       CALL DELETE(arg)
  4365.                       arg=bbspath'FileNotes/'plaindir'/'newarg
  4366.                       CALL savelines(arg)
  4367.                       IF comment='' THEN
  4368.                         DO
  4369.                           mpath=libpath||plaindir
  4370.                           IF RENAME(mpath'/'argname,mpath'/'newarg)=0 THEN
  4371.                             SAY 'Rename failed on main file!'CR
  4372.                         END
  4373.                       ELSE
  4374.                         DO
  4375.                           t=LASTPOS('/',comment)
  4376.                           IF t=0 THEN t=LASTPOS(':',comment)
  4377.                           mpath=LEFT(comment,t-1)
  4378.                           IF RENAME(comment,mpath'/'newarg)=1 THEN
  4379.                             ADDRESS COMMAND 'C:FileNote' arg mpath'/'newarg
  4380.                           ELSE SAY 'Rename failed on external file!'CR
  4381.                         END
  4382.                       files.brfilenum=STRIP(WORD(files.brfilenum,1)) newarg
  4383.                       anum=files.brfilenum.0
  4384.                       alpha.anum=OVERLAY(newarg,alpha.anum,1,WORDINDEX(alpha.anum,2)-2)
  4385.                       CALL send2log('RENAME:' argname 'to' newarg 'in' plaindir)
  4386.                       argname=newarg
  4387.                       sortalphaflag=1
  4388.                       savefileflag=1
  4389.                       CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  4390.                     END
  4391.                 END
  4392.             END
  4393.           IF getinput(1 1 'Move' argname '? (Ny) > ')='Y' THEN
  4394.             DO
  4395.               IF chdir()=0 THEN
  4396.                 DO
  4397.                   IF UPPER(dirs.dirnum)~=UPPER(WORD(files.brfilenum,1)) THEN
  4398.                     DO
  4399.                       CALL readlines(arg 1)
  4400.                       CALL movefile(brfilenum dirs.dirnum)
  4401.                     END
  4402.                 END
  4403.             END
  4404.           IF savefileflag>0 THEN CALL savefilelist()
  4405.           CALL setdir(curdir)
  4406.         END
  4407.       ELSE IF brcom='N' THEN
  4408.         DO
  4409.           brfilenum=brfilenum-1
  4410.           nonstop=1
  4411.           SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E'def||CR
  4412.           SAY CR
  4413.           CALL DELAY(99)
  4414.           brcom=''
  4415.         END
  4416.       ELSE IF brcom='C' THEN
  4417.         DO
  4418.           temp=STRIP(WORD(STATEF(arg),8))
  4419.           IF temp='' THEN temp=libpath||plaindir'/'argname
  4420.           CALL Contents.rexx(temp)
  4421.           IF EXISTS('RAM:CONTENTS') THEN
  4422.             DO
  4423.               CALL cleanline(1)
  4424.               CALL showtext('RAM:CONTENTS' 0)
  4425.               IF waitchar~='Q' THEN CALL waiting()
  4426.               nonstop=0
  4427.             END
  4428.           ELSE SAY pen3'Not an archived file.'def||CR
  4429.         END
  4430.       ELSE IF brcom='D' THEN
  4431.         DO
  4432.           arg2=arg
  4433.           arg=brfilenum
  4434.           CALL dload()
  4435.           arg=arg2
  4436.         END
  4437.       ELSE IF brcom='E' THEN
  4438.         DO
  4439.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4440.             DO
  4441.               firstedit=5
  4442.               IF level>sysoplevel THEN firstedit=1
  4443.               CALL bbsEd.rexx(firstedit arg name TRUNC(maxtime-TIME('E'))-28)
  4444.               CALL checkfilechanges()
  4445.             END
  4446.         END
  4447.       ELSE IF brcom='K' THEN
  4448.         DO
  4449.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4450.             DO
  4451.               IF getinput(1 1 pen3'Do you really want to kill this file? (nY) >'def)~='N' THEN
  4452.                 DO
  4453.                   tempnum=WORD(lynes.1,2)
  4454.                   IF tempnum=lastfile THEN
  4455.                     DO
  4456.                       CALL DELETE(bbspath'Numbers/LastFile')
  4457.                       CALL DELAY(28)
  4458.                       lastfile=lastfile-1
  4459.                       CALL countcheck('Numbers/LastFile' lastfile)
  4460.                     END
  4461.                   files.tempnum=''
  4462.                   tempnum2=files.tempnum.0
  4463.                   alpha.tempnum2='0 0' tempnum '100'
  4464.                   savefileflag=1
  4465.                   IF SHOW('P','BBBBS_LOCAL') THEN CALL savefilelist()
  4466.                   finfo=STATEF(arg)
  4467.                   IF WORDS(finfo)>7 THEN argname=WORD(finfo,8)
  4468.                   CALL DELETE(argname)
  4469.                   CALL DELETE(arg)
  4470.                   CALL send2log('Killed:' argname)
  4471.                   SAY argname pen3'has been deleted.'def||CR
  4472.                   CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  4473.                 END
  4474.             END
  4475.         END
  4476.       ELSE IF brcom='R' & (endtest='.TXT' | UPPER(argname)='.'UPPER(STRIP(LEFT(plaindir,15)))) THEN
  4477.         DO
  4478.           vcount=WORD(lynes.2,7)+1
  4479.           lynes.2=STRIP(DELWORD(lynes.2,7,1)) vcount
  4480.           edtype=''
  4481.           CALL savelines(arg)
  4482.           CALL showtext(argname 1)
  4483.         END
  4484.       ELSE brfilenum=brfilenum-1
  4485.     END
  4486. END
  4487. CALL setdir(brdir)
  4488. waitchar=''
  4489. IF nonstop THEN CALL waiting()
  4490. nonstop=0
  4491. CALL savedata(0)
  4492. RETURN
  4493.  
  4494.  
  4495. movefile:
  4496. PARSE ARG fnum movdir .
  4497. fromdir=STRIP(WORD(files.fnum,1))
  4498. farg=STRIP(WORD(files.fnum,2))
  4499. md=libpath||movdir
  4500. mf=md'/'farg
  4501. fd=libpath||fromdir
  4502. ff=fd'/'farg
  4503. CALL DELETE(md'/.'STRIP(LEFT(movdir,15)))
  4504. CALL DELETE(fd'/.'STRIP(LEFT(fromdir,15)))
  4505. fn=bbspath'FileNotes/'fromdir'/'farg
  4506. commen=WORD(STATEF(fn),8)
  4507. IF commen~='' THEN
  4508.   DO
  4509.     ff=commen
  4510.     n=LASTPOS('/',ff)
  4511.     IF n>1 THEN
  4512.       DO
  4513.         xf=SUBSTR(ff,n+1)
  4514.         tfd=LEFT(ff,n-1)
  4515.         n=LASTPOS('/',tfd)
  4516.         IF n=0 THEN n=LASTPOS(':',tfd)
  4517.         IF n>0 THEN
  4518.           DO
  4519.             tmd=LEFT(tfd,n)||movdir
  4520.             SAY 'Rename external file'pen3 ff||def||CR
  4521.             IF getinput(1 1 '                  to'pen3 tmd'/'farg||def'? (Ny) > ')='Y' THEN
  4522.               DO
  4523.                 fd=tfd
  4524.                 md=tmd
  4525.                 mf=md'/'farg
  4526.                 commen=md'/'xf
  4527.               END
  4528.             ELSE IF getinput(1 1 '          or move to'pen3 mf||def'? (Ny) > ')='Y' THEN
  4529.               DO
  4530.                 fd=tfd
  4531.                 commen=''
  4532.               END
  4533.           END
  4534.       END
  4535.   END
  4536. CALL MAKEDIR(md)
  4537. IF RENAME(ff,mf)=0 THEN
  4538.   DO
  4539.     ADDRESS COMMAND 'C:COPY' ff mf
  4540.     IF EXISTS(mf) THEN
  4541.       IF DELETE(ff)~=1 THEN SAY pen3'Unable to delete'def ff||pen3'.'def||CR
  4542.   END
  4543. files.fnum=movdir farg
  4544. lynes.3=DELWORD(lynes.3,WORDS(lynes.3),1)
  4545. lynes.3=STRIP(lynes.3) movdir
  4546. CALL MAKEDIR(bbspath'FileNotes/'movdir)
  4547. mn=bbspath'FileNotes/'movdir'/'farg
  4548. CALL savelines(mn)
  4549. ndx=files.fnum.0
  4550. dnum=finddirnum(movdir)
  4551. alpha.ndx=OVERLAY(RIGHT(dnum,2) movdir,alpha.ndx,31,15)
  4552. IF EXISTS(mn) THEN
  4553.   DO
  4554.     CALL DELETE(fn)
  4555.     comm='C:FileNote' mn
  4556.     IF commen~='' THEN comm=comm commen
  4557.     ADDRESS COMMAND comm
  4558.   END
  4559. savefileflag=1
  4560. line='Moved:' fromdir'/'farg 'to' movdir
  4561. CALL send2log(line)
  4562. SAY line||CR
  4563. RETURN
  4564.  
  4565.  
  4566. textsearch:
  4567. ARG sfile' 'sarg
  4568. IF sarg='' THEN RETURN 0
  4569. x=OPEN(f,sfile,'R')
  4570. IF x=0 THEN RETURN 0
  4571. stemp=UPPER(READCH(f,65000))
  4572. CALL CLOSE(f)
  4573. retflag=0
  4574. IF POS(sarg,stemp)>0 THEN retflag=1
  4575. DROP stemp
  4576. RETURN retflag
  4577.  
  4578.  
  4579. bbsSEARCH:
  4580. smenu=menu
  4581. test=UPPER(LEFT(arg,1))
  4582. IF test='F' THEN smenu='FILE'
  4583. IF test='M' THEN smenu='MSG'
  4584. IF test='U' THEN smenu='MAIN'
  4585. IF smenu='ALL' THEN
  4586.   DO
  4587.     junk=getinput(1 1 'Search ['pen3'F'def']iles ['pen3'M'def']essages or ['pen3'U'def']sers (fmu) > ')
  4588.     IF junk='F' THEN smenu='FILE'
  4589.     ELSE IF junk='M' THEN smenu='MSG'
  4590.     ELSE IF junk='U' THEN smenu='MAIN'
  4591.     ELSE RETURN
  4592.   END
  4593. IF WORDS(arg)>1 THEN searcharg=UPPER(SUBSTR(arg,WORDINDEX(arg,2)))
  4594. ELSE searcharg=getinput(0 0 pen3'Search Phrase: 'def)
  4595. IF LENGTH(STRIP(searcharg))=0 THEN RETURN
  4596. searcharg=COMPRESS(searcharg,'*')
  4597. CALL send2log('SEARCH:' smenu 'for' searcharg)
  4598. IF smenu='NEW' | smenu='MAIN' THEN
  4599.   DO
  4600.     SAY 'Searching Userlist...'lineup||CR
  4601.     CALL FileList(bbspath'Users/*'searcharg'*',sl)
  4602.     SAY 'Found' sl.0 'matches                    'CR
  4603.     DO i=1 TO sl.0
  4604.       SAY sl.i||CR
  4605.       IF ~nonstop THEN
  4606.         IF i//linesperpage=0 THEN
  4607.           IF waiting2() THEN LEAVE i
  4608.     END
  4609.     DROP sl.
  4610.   END
  4611. IF smenu='MSG' THEN
  4612.   DO
  4613.     CALL SETCLIP('BBSMSG_SEARCH',searcharg)
  4614.     SAY lm
  4615.     CALL bbsMsg.rexx(maxtime-TRUNC(TIME('E')) name password) 
  4616.   END
  4617. IF smenu='FILE' THEN
  4618.   DO
  4619.     lne=pen3'Searching'
  4620.     curdironly=0
  4621.     IF getinput(1 1 'Search one library only? (Ny) > ')='Y' THEN
  4622.       DO
  4623.         IF chdir()>0 THEN RETURN
  4624.         curdironly=1
  4625.         lne=lne 'the'def plaindir pen3'library'
  4626.         SAY CR
  4627.       END
  4628.     ELSE
  4629.       DO
  4630.         lne=lne 'all file libraries'
  4631.         SAY CR
  4632.         SAY pen3'WARNING!'def 'Searching' RIGHT(files.0,5) '['pen3'F'def']ull descriptions may take'pen3 TRUNC(files.0/(114*cpu)+.05,1) def'minutes!'CR
  4633.       END
  4634.     test=getinput(1 1 '   ['pen3'A'def']lphaList search or ['pen3'F'def']ull descriptions? (Afq) > ')
  4635.     IF test='Q' THEN RETURN
  4636.     SAY CR
  4637.     SAY lne 'for'def UPPER(searcharg)||CR
  4638.     SAY pen3' - To ABORT, press CTRL-E -'def||CR
  4639.     SAY CR
  4640.     IF test~='F' THEN
  4641.       DO
  4642.         CALL fileheader()
  4643.         IF curdironly=1 THEN
  4644.           DO
  4645.             af=libpath||dirs.dirnum'/.'STRIP(LEFT(dirs.dirnum,15))
  4646.             IF EXISTS(af) THEN
  4647.               DO
  4648.                 CALL readlines(af 1)
  4649.                 DO i=1 TO lynes.0
  4650.                   CALL busywait(8 i lynes.0)
  4651.                   tempnum=POS(UPPER(searcharg),UPPER(lynes.i))
  4652.                   IF tempnum>0 THEN
  4653.                     DO
  4654.                       CALL busywait(4 0)
  4655.                       SAY lynes.i||CR
  4656.                       SAY pen3||LEFT(' ',tempnum-1)||lineup||UPPER(searcharg)||def||CR
  4657.                       CALL busywait(4 1)
  4658.                     END
  4659.                 END
  4660.               END
  4661.           END
  4662.         IF curdironly=0 | ~EXISTS(af) THEN
  4663.           DO i=1 TO alpha.0
  4664.             CALL busywait(60 i alpha.0)
  4665.             ii=WORD(alpha.i,4)
  4666.             IF ii>level THEN ITERATE i
  4667.             IF curdironly=1 & ii~=dirnum THEN ITERATE i
  4668.             ii=WORD(alpha.i,3)
  4669.             IF POS(UPPER(WORD(files.ii,1)),data.21)>0 THEN ITERATE i
  4670.             tempnum=POS(UPPER(searcharg),UPPER(alpha.i))
  4671.             IF tempnum>0 THEN
  4672.               DO
  4673.                 CALL busywait(4 0)
  4674.                 SAY alpha.i||CR
  4675.                 SAY pen3||LEFT(' ',tempnum-1)||lineup||UPPER(searcharg)||def||CR
  4676.                 CALL busywait(4 1)
  4677.               END
  4678.           END
  4679.       END
  4680.     ELSE
  4681.       DO
  4682.         cck=countcheck('Numbers/LastFile' 0)
  4683.         nonstop=1
  4684.         DO i=1 TO cck
  4685.           IF i//50=0 THEN CALL checkdcd()
  4686.           iii=cck+1-i
  4687.           IF files.iii='' THEN ITERATE i
  4688.           ii=files.iii.0
  4689.           ii=WORD(alpha.ii,4)
  4690.           IF ii>level THEN ITERATE i
  4691.           IF curdironly=1 & ii~=dirnum THEN ITERATE i
  4692.           IF POS(UPPER(WORD(files.iii,1)),data.21)>0 THEN ITERATE i
  4693.           farg=WORD(files.iii,1)'/'WORD(files.iii,2)
  4694.           SAY '1B'x'M' RIGHT(farg,40) LEFT(iii,7)||CR
  4695.           IF textsearch(bbspath'FileNotes/'farg searcharg) THEN
  4696.             DO
  4697.               savei=i
  4698.               CALL readlines(bbspath'FileNotes/'farg 1)
  4699.               nonstop=1
  4700.               CALL seelines(2)
  4701.               i=savei
  4702.               SAY CR
  4703.               SAY CR
  4704.             END
  4705.         END
  4706.       END
  4707.     CALL busywait(4 0)
  4708.   END
  4709. searcharg=''
  4710. nonstop=0
  4711. SAY CR
  4712. IF i<999999 THEN SAY lineup'All available items have been searched.                        'CR
  4713. SAY CR
  4714. CALL waiting()
  4715. RETURN
  4716.  
  4717.  
  4718. finddirnum:
  4719. ARG fdirname .
  4720. DO fdir=1 TO 99
  4721.   IF UPPER(dirs.fdir)=UPPER(fdirname) THEN RETURN fdir
  4722. END
  4723. RETURN 100
  4724.  
  4725.  
  4726. writebuffer:
  4727. PARSE ARG bufname .
  4728. Capture OFF
  4729. CALL DELETE(bufname)
  4730. SAY 'Type 'pen3'/E'def' or 'pen3'/S'def' on a new line to Exit and Save.'CR
  4731. IF EXISTS(bufname) THEN
  4732.   DO
  4733.     CALL DELAY(56)
  4734.     CALL DELETE(bufname)
  4735.     CALL DELAY(56)
  4736.   END
  4737. CaptWrap 74
  4738. Send pen3
  4739. Capture bufname
  4740. Send def
  4741. TimeOut 120
  4742. DO bufloop=1
  4743.   Wait '/E,/S,RING,NO CARRIER'
  4744.   Status 'L'
  4745.   test=LEFT(UPPER(cleanstring(0':'RESULT)),2)
  4746.   CALL checkdcd()
  4747.   IF test='/E' | test='/S' | test='/X' THEN LEAVE bufloop
  4748. END
  4749. IF test~='/X' THEN Send '\b\b'pen3
  4750. Capture OFF
  4751. CALL checkdcd()
  4752. TimeOut maxidle
  4753. SAY def||CR
  4754. startnum=lynes.0+1
  4755. CALL readlines(bufname startnum)
  4756. CALL wrapbuf(startnum)
  4757. QUEUE CR
  4758. RETURN
  4759.  
  4760.  
  4761. wrapbuf:
  4762. ARG startnum .
  4763. CALL cleanline(1)
  4764. SAY pen3'Wordwrapping...'def||CR
  4765. lynes.startnum=TRANSLATE(lynes.startnum,' ','09'x)
  4766. lynes.startnum=cleanstring(2':'lynes.startnum)
  4767. DO wi=startnum WHILE wi<=lynes.0
  4768.   wj=wi+1
  4769.   lynes.wj=TRANSLATE(lynes.wj,' ','09'x)
  4770.   lynes.wj=cleanstring(2':'lynes.wj)
  4771.   IF LENGTH(lynes.wi)>75 THEN
  4772.     DO
  4773.       testchar=''
  4774.       IF lynes.wj~='' THEN testchar=LEFT(lynes.wj,1)
  4775.       IF testchar=' ' | testchar='.' | testchar=':' THEN
  4776.         DO
  4777.           DO wjj=lynes.0 TO wi+1 BY -1
  4778.             wk=wjj+1
  4779.             lynes.wk=lynes.wjj
  4780.           END
  4781.           lynes.wj=''
  4782.           lynes.0=lynes.0+1
  4783.         END
  4784.       DO wl=WORDS(lynes.wi) TO 1 BY -1 WHILE LENGTH(lynes.wi)>74
  4785.         IF WORDS(lynes.wi)=1 THEN
  4786.           lynes.wi=LEFT(lynes.wi,74) SUBSTR(lynes.wi,75)
  4787.         lynes.wj=WORD(lynes.wi,wl) lynes.wj
  4788.         lynes.wi=STRIP(DELWORD(lynes.wi,wl,1))
  4789.       END
  4790.     END
  4791. END
  4792. RETURN
  4793.  
  4794.  
  4795. seelines:
  4796. ARG fancy .
  4797. DO i=1 TO lynes.0
  4798.   IF fancy=0 THEN SAY lynes.i||def||CR
  4799.   ELSE
  4800.     DO
  4801.       IF LEFT(lynes.i,2)=': ' & WORDS(lynes.i)=2 THEN ITERATE i
  4802.       ELSE IF LEFT(lynes.i,10)='Directory ' | LEFT(lynes.i,5)='=====' THEN
  4803.         SAY pen3||lynes.i||def||CR
  4804.       ELSE SAY lynes.i||CR
  4805.       IF fancy=2 & colorflag=1 THEN
  4806.         DO
  4807.           IF searcharg~='' THEN
  4808.             DO
  4809.               testpos=POS(UPPER(searcharg),UPPER(lynes.i))
  4810.               IF testpos>0 THEN
  4811.                 SAY LEFT(' ',testpos-1)||pen3||lineup||UPPER(searcharg)||def||CR
  4812.             END
  4813.           IF i=1 THEN
  4814.             IF WORD(lynes.1,3)='Reply' THEN
  4815.               DO
  4816.                 testpos=WORDINDEX(lynes.1,3)
  4817.                 SAY LEFT(' ',testpos-1)||pen3||lineup||SUBSTR(lynes.1,testpos)||def||CR
  4818.               END
  4819.         END
  4820.     END
  4821.   IF i//linesperpage=0 & i<lynes.0 THEN
  4822.     IF waiting2() THEN LEAVE i
  4823. END
  4824. nonstop=0
  4825. RETURN
  4826.  
  4827.  
  4828. readlines:
  4829. CALL CLOSE(f)
  4830. PARSE ARG tempname readstart .
  4831. IF ~readopen(tempname) THEN RETURN 1
  4832. IF readstart<2 THEN lynes.=''
  4833. DO ri=readstart
  4834.   line=READLN(f)
  4835.   IF EOF(f) THEN BREAK
  4836.   lynes.ri=line
  4837. END
  4838. lynes.0=ri-1
  4839. CALL CLOSE(f)
  4840. DO ri=lynes.0 TO 0 BY -1 WHILE LENGTH(lynes.ri)=0 | LEFT(UPPER(lynes.ri),2)='/E' | LEFT(UPPER(lynes.ri),2)='/S'
  4841. END
  4842. lynes.0=ri
  4843. RETURN 0
  4844.  
  4845.  
  4846. savelines:
  4847. PARSE ARG tempname .
  4848. IF EXISTS(tempname) & edtype='MAIL' THEN
  4849.   DO
  4850.     ok=OPEN(f,tempname,'A')
  4851.     IF ok~=0 THEN CALL WRITELN(f,LEFT('',74,'^'))
  4852.   END
  4853. ELSE ok=OPEN(f,tempname,'W')
  4854. IF ok=0 THEN
  4855.   DO
  4856.     line='***' tempname 'failed to open for saving!'
  4857.     CALL send2log(line)
  4858.     SAY line||CR
  4859.     RETURN 1
  4860.   END
  4861. DO wi=1 TO lynes.0
  4862.   CALL WRITELN(f,lynes.wi)
  4863. END
  4864. CALL CLOSE(f)
  4865. RETURN 0
  4866.  
  4867.  
  4868. sortuserlist:
  4869. uf=bbspath'Lists/USERS'
  4870. IF sortuserflag THEN CALL DELETE(uf)
  4871. sortuserflag=0
  4872. IF ~EXISTS(uf) THEN
  4873.   DO
  4874.     users=bbsSortUsers.rexx(bbspath bbsname)
  4875.     RETURN
  4876.   END
  4877. ELSE
  4878.   DO
  4879.     IF OPEN(f,uf,'R')=0 THEN RETURN
  4880.     users=0
  4881.     DO i=1
  4882.       dat=READCH(f,65000)
  4883.       IF EOF(f) THEN LEAVE i
  4884.       users=users+WORDS(dat)
  4885.     END
  4886.     CALL CLOSE(f)
  4887.   END
  4888. SAY CENTER(RIGHT(users,8) 'Users on'pen3 bbsname,74)||def||CR
  4889. RETURN
  4890.  
  4891.  
  4892. showuserlist:
  4893. IF data.5='' THEN line='Here are the EMail names of the' users 'users on' bbsname '.'
  4894. ELSE line='   'users 'users. Use these names to address messages.'
  4895. SAY pen3||line||def||CR
  4896. CALL showtext(bbspath'Lists/USERS' 1)
  4897. IF data.5~='' THEN CALL waiting()
  4898. RETURN
  4899.  
  4900.  
  4901. msgcount:
  4902. ARG countdir .
  4903. lastmess=0
  4904. totmsgs=0
  4905. unred=0
  4906. IF ~EXISTS(msgpath||countdir) THEN RETURN
  4907. IF STATEF(msgpath||countdir)=msg.countdir.1 THEN totmsgs=msg.countdir.0
  4908. ELSE
  4909.   DO
  4910.     totmsgs=WORDS(SHOWDIR(msgpath||countdir))
  4911.     msg.countdir.0=totmsgs
  4912.     msg.countdir.1=STATEF(msgpath||countdir)
  4913.   END
  4914. IF countdir>level | FIND(data.21,i)>0 THEN RETURN
  4915. lastread.countdir=WORD(data.22,countdir)
  4916. IF ~DATATYPE(lastread.countdir,'W') THEN lastread.countdir=0
  4917. lastmess=countcheck('Numbers/LastMessage'countdir 0)
  4918. IF lastread.countdir<0 THEN RETURN
  4919. firstmess=countcheck('Numbers/FirstMessage'countdir 0)
  4920. IF lastread.countdir<firstmess THEN lastread.countdir=firstmess-1
  4921. IF lastmess>0 THEN
  4922.   IF lastread.countdir>=0 THEN
  4923.     DO
  4924.       IF lastread.countdir<(firstmess-1) THEN lastread.countdir=firstmess-1
  4925.       unred=lastmess-lastread.countdir
  4926.       IF unred>totmsgs THEN unred=totmsgs
  4927.       IF unred>0 | ~logonflag THEN
  4928.         DO
  4929.           cline=RIGHT(unred,5) 'new of' RIGHT(lastmess,5) 'messages,'
  4930.           cline=cline RIGHT(totmsgs,5) 'still online in' 
  4931.           cline=cline RIGHT(countdir,2)',' msg.countdir
  4932.           SAY pen6||cline||def||CR
  4933.         END
  4934.     END
  4935. RETURN
  4936.  
  4937.  
  4938. counts:
  4939. SAY CR
  4940. SAY 'Working...'CR
  4941. SAY CR
  4942. temp=''
  4943. DO i=1 TO 4
  4944.   temp=temp||CENTER(copyright.i,75)||'0D0A'x
  4945. END
  4946. CALL SETCLIP('BBS_copyright',temp||CR)
  4947. CALL bbsSTATS.rexx(name colorflag 0 emailonline grand grand2 files.0 users)
  4948. SAY CR
  4949. CALL waiting2()
  4950. IF waitchar='Q' THEN RETURN
  4951. CALL showmarked(1)
  4952. CALL logonstats()
  4953. nonstop=0
  4954. CALL waiting()
  4955. RETURN
  4956.  
  4957.  
  4958. countmail:
  4959. SAY '   Counting online email...'lineup||CR
  4960. emailonline=0
  4961. t=SHOWDIR(bbspath'Users')
  4962. DO ti=1 TO WORDS(t)
  4963.   emailonline=emailonline+WORDS(SHOWDIR(bbspath'Email/'WORD(t,ti)))
  4964. END
  4965. SAY lineup'       'emailonline' letters online.'CR
  4966. RETURN
  4967.  
  4968.  
  4969. hourly:
  4970. IF level=99 & nonstop~=1 THEN
  4971.   DO
  4972.     IF getinput(1 1 'Zero The Hourly Averages? (Ny) > ')='Y' THEN
  4973.       ADDRESS COMMAND 'C:Delete >*' bbspath'Numbers/Hourly/#?'
  4974.     CALL cleanline(1)
  4975.   END
  4976. SAY lm
  4977. CALL ShowHourly.rexx(name linesperpage colorflag nonstop)
  4978. RETURN
  4979.  
  4980.  
  4981. logonstats:
  4982. IF level=0 THEN RETURN
  4983. SAY bak2||name||def 'Last on' DATE('W',lastondate,'I') DATE(,lastondate,'I') lastontime||CR
  4984. tempnum=countcheck('Numbers/LastFile' 0)-lastbrowse
  4985. IF tempnum>files.0 THEN tempnum=files.0
  4986. line=RIGHT(countcheck('Numbers/LastFile' 0),5) 'uploaded,'
  4987. line=line RIGHT(files.0,5) 'files online.'CR
  4988. IF tempnum>0 THEN SAY RIGHT(tempnum,5) 'new of' line
  4989. ELSE SAY '   No new of' line
  4990. totmsg=0
  4991. grand=0
  4992. grand2=0
  4993. DO i=1 TO 99
  4994.   IF msg.i='' THEN ITERATE i
  4995.   CALL msgcount(i)
  4996.   totmsg=totmsg+unred
  4997.   grand=grand+totmsgs
  4998.   grand2=grand2+lastmess
  4999. END
  5000. line=RIGHT(grand2,5) 'messages,' RIGHT(grand,5) 'still online.'||CR
  5001. IF totmsg>0 THEN SAY RIGHT(totmsg,5) 'new of' line
  5002. ELSE SAY '   No new of' line
  5003.  
  5004. callsleft:
  5005. test=WORD(data.11,9)
  5006. IF test<1 THEN
  5007.   DO
  5008.     IF DATE('S')=WORD(data.13,1) THEN
  5009.       DO
  5010.         line=pen0||bak1' Attention! 'def 'This is your last call for'
  5011.         line=line DATE('W')',' DATE()
  5012.       END
  5013.     ELSE line='It''s after midnight here, you may call' WORD(data.11,5) 'more times today.'
  5014.   END
  5015. ELSE
  5016.   DO
  5017.     line='You may call' test 'more time'
  5018.     IF test~=1 THEN line=line's'
  5019.     line=line 'today.'
  5020.   END
  5021. SAY line||CR
  5022. RETURN
  5023.  
  5024.  
  5025. checkdcd:
  5026. IF GETCLIP('BBS_interpret')='' THEN
  5027.   DO
  5028.     dcd
  5029.     IF RC=0 THEN
  5030.       DO
  5031.         DO dcds=1 TO 3  /* 5 second delay */
  5032.           CALL DELAY(50)
  5033.           dcd
  5034.           IF RC~=0 THEN RETURN
  5035.         END
  5036.         dcd
  5037.         IF RC=0 THEN
  5038.           DO
  5039.             SAY CR
  5040.             Capture OFF
  5041.             Remote OFF
  5042.             CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  5043.             line='^^^^^ LOST CARRIER! ^^^' DATE() TIME() '^^^^^'
  5044.             SAY line||CR
  5045.             Send '\dATH1\r'
  5046.             CALL send2log(line)
  5047.             CALL sound('LOST')
  5048.             IF newpassword='' THEN SIGNAL DONE
  5049.             ELSE SIGNAL OUT
  5050.           END
  5051.       END
  5052.   END
  5053. CALL checkexternal()
  5054. RETURN
  5055.  
  5056.  
  5057. sound:
  5058. ARG snd 
  5059. IF bbsprefs.13=1 THEN RETURN
  5060. ADDRESS AREXX bbsSounds.rexx bbspath'Sounds/' snd 
  5061. RETURN
  5062.  
  5063.  
  5064. checkexternal:
  5065. xmsg=GETCLIP('BBS_MESSAGE')
  5066. Capture
  5067. IF RC=0 & xmsg~='' & uldlflag=0 THEN
  5068.   DO
  5069.     SAY CR
  5070.     SAY bak2' Message From BBBBS: 'def||CR
  5071.     SAY xmsg||CR
  5072.     SAY CR
  5073.     CALL SETCLIP('BBS_MESSAGE')
  5074.     CALL waiting()
  5075.   END
  5076. xstring=GETCLIP('BBS_interpret')
  5077. IF xstring~='' THEN
  5078.   DO
  5079.     CALL SETCLIP('BBS_interpret')
  5080.     INTERPRET xstring
  5081.   END
  5082. xcom=GETCLIP('BBS_COMMAND')
  5083. IF xcom~='' THEN
  5084.   DO
  5085.     CALL SETCLIP('BBS_COMMAND')
  5086.     IF POS('G',xcom)>0 THEN SIGNAL LOGOUT2
  5087.     IF opt~='' THEN
  5088.       DO
  5089.         IF POS('B',xcom)>0 THEN test='/X'
  5090.         IF POS('L',xcom)>0 THEN CALL uplevel()
  5091.         IF POS('M',xcom)>0 THEN CALL validate('DEF.MEMBER')
  5092.         IF POS('R',xcom)>0 THEN CALL upratio()
  5093.         IF POS('T',xcom)>0 THEN CALL uptime()
  5094.         IF POS('V',xcom)>0 THEN CALL validate('DEF.CBV')
  5095.       END
  5096.     IF POS('C',xcom)>0 THEN CALL chat()
  5097.   END
  5098. RETURN
  5099.  
  5100.  
  5101. chat:
  5102. chatrequest=0
  5103. chattime=TIME('E')
  5104. SAY 'Entering chat mode with sysop.'CR
  5105. MSG pen3'- Press backslash [\] to exit -'def
  5106. SAY 'Press [RETURN] twice to tell' sysop 'you are finished typing.'CR
  5107. SAY CR
  5108. OPTIONS PROMPT ''
  5109. string=''
  5110. DO WHILE(string~='\')
  5111.   PULL string
  5112.   CALL checkdcd()
  5113. END
  5114. maxtime=maxtime+(TIME('E')-chattime)%1
  5115. RETURN
  5116.  
  5117.  
  5118. readopen:
  5119. PARSE ARG fname
  5120. ok=OPEN(f,fname,'R')
  5121. IF ok~=0 THEN RETURN 1
  5122. line=fname 'failed to open for reading!'
  5123. SAY line||CR
  5124. CALL send2log(line)
  5125. RETURN 0
  5126.  
  5127.  
  5128. writeopen:
  5129. PARSE ARG fname
  5130. CALL CLOSE(f)
  5131. ok=OPEN(f,fname,'W')
  5132. IF ok~=0 THEN RETURN 1
  5133. line=fname 'failed to open for writing!'
  5134. SAY line||CR
  5135. CALL send2log(line)
  5136. RETURN 0
  5137.  
  5138.  
  5139. set_grand:
  5140. SAY 'Setting up public message conferences...'CR
  5141. grand=0
  5142. DO i=1 TO 99
  5143.   IF msg.i='' THEN ITERATE i
  5144.   msg.i.0=WORDS(SHOWDIR(msgpath||i,'F'))
  5145.   msg.i.1=STATEF(msgpath||i)
  5146.   grand=grand+msg.i.0
  5147. END
  5148. RETURN
  5149.  
  5150.  
  5151. checkstats:          /* clip is set and cleared by stats programs */
  5152. IF TIME('H')>3 & GETCLIP('BBS_STAT')='' THEN
  5153.   DO
  5154.     IF WORD(STATEF(bbspath'Logs/Numbers.dat'),5)<DATE('I') THEN
  5155.       ADDRESS AREXX bbsNumbers.rexx
  5156.     ELSE IF EXISTS(bbspath'Information/STATS.ULDL') THEN
  5157.       DO
  5158.         lfinfo=STATEF(bbspath'Information/STATS.ULDL')
  5159.         IF WORD(lfinfo,5)<DATE('I') THEN
  5160.           DO
  5161.             ADDRESS AREXX bbsULDL.rexx
  5162.             CALL DELAY(99)
  5163.           END
  5164.       END
  5165.     IF TIME('H')>4 & EXISTS(bbspath'Information/STATS.USER') THEN
  5166.       DO
  5167.         ufinfo=STATEF(bbspath'Information/STATS.USER')
  5168.         IF WORD(ufinfo,5)<DATE('I') THEN
  5169.           DO
  5170.             ADDRESS AREXX bbsUSER.rexx
  5171.             CALL DELAY(99)
  5172.           END
  5173.       END
  5174.     IF grand>SYSTEM_MSG_LIMIT & TIME('H')>5 & TIME('H')<9 THEN
  5175.       DO
  5176.         SAY 'Doing Message Conference Maintenence...'CR
  5177.         Send 'ATH1\r'
  5178.         CALL bbsMAINT.baud(SYSTEM_MSG_LIMIT sysop)
  5179.         CALL set_grand()
  5180.         Send 'ATZ\r'
  5181.       END
  5182.   END
  5183. RETURN
  5184.  
  5185.  
  5186. zerovars:
  5187. lastread.=0
  5188. totwrit.=0
  5189. data.=''
  5190. libs.=''
  5191. msgs.=''
  5192. clear_marked=0
  5193. sortalphaflag=0
  5194. savefileflag=0
  5195. sortuserflag=0
  5196. linesperpage=22
  5197. chatrequest=0
  5198. lastbrowse=0
  5199. buildalpha=0
  5200. uldlflag=0
  5201. terseflag=0
  5202. warnings=0
  5203. winnings=0
  5204. menuflag=0
  5205. nonstop=0
  5206. libtext=1
  5207. dirnum=1
  5208. msgdir=1
  5209. level=0
  5210. newfilesflag=0
  5211. newfilesdate=''
  5212. newpassword=''
  5213. replymsg=''
  5214. waitchar=''
  5215. string=''
  5216. name=''
  5217. city='?'
  5218. opt=''
  5219. clr=''
  5220. RETURN
  5221.  
  5222.  
  5223. SYNTAX:
  5224. FAILURE:
  5225. lin.1=''ERRORTEXT(RC)''
  5226. lin.2=SIGL-1     SOURCELINE(SIGL-1)
  5227. lin.3=SIGL ''SOURCELINE(SIGL)''
  5228. lin.4=SIGL+1     SOURCELINE(SIGL+1)
  5229. DO er=1 TO 4
  5230.   IF level>sysoplevel THEN SAY lin.er||CR
  5231.   CALL send2log(lin.er)
  5232. END
  5233. CALL CLOSE(f)
  5234. IF newpassword='' THEN SIGNAL DONE  /* no user logged on, quit quietly */
  5235. SAY CR
  5236. CALL checkdcd()
  5237. waitchar=''
  5238. IF data.1~='' & data.5~='' & data.20~='' THEN CALL savedata(0)
  5239. SIGNAL RESTART
  5240.  
  5241.  
  5242. BREAK_E:
  5243. CALL CLOSE(f)
  5244. SAY pen3'*** CTRL-E BREAK ***'def||CR
  5245. waitchar=''
  5246. string=''
  5247. nonstop=0
  5248. rnonstop=0
  5249. brostop=0
  5250. i=999999
  5251. wi=999999
  5252. ui=999999
  5253. ni=-1
  5254. QUEUE CR
  5255. RETURN 0
  5256.  
  5257.  
  5258. HALT:
  5259. BREAK_C:
  5260. SIGNAL OFF BREAK_C
  5261. SIGNAL OFF BREAK_E
  5262. CALL CLOSE(f)
  5263. IF newpassword='' THEN
  5264.   DO
  5265.     CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  5266.     SIGNAL DONE  /* no user logged on, quit quietly */
  5267.   END
  5268. CALL checkdcd()
  5269. SAY CR
  5270. IF warnings<1 THEN  /* just 1 warning */
  5271.   DO
  5272.     warnings=warnings+1
  5273.     SAY CR
  5274.     SAY CR
  5275.     SAY CR
  5276.     SAY 'If you didn''t press CTRL-C then...   HEY!    Wake up!'CR
  5277.     SAY '                                     Auto-disconnect in' TRUNC(maxidle/60+.5) 'minutes!'CR
  5278.     SAY CR
  5279.     SAY 'If you DID press CTRL-C,  PLEASE  use CTRL-E next time instead.'CR
  5280.     SAY CR
  5281.     Remote OFF
  5282.     Send '^G\w^G\w^G^G^G^G'
  5283.     Remote ON
  5284.     waitchar=''
  5285.     string=''
  5286.     nonstop=0
  5287.     CALL SETCLIP('BBS_door')
  5288.     SIGNAL ON BREAK_C
  5289.     CALL waiting()
  5290.     SIGNAL RESTART
  5291.   END
  5292. CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  5293. SAY 'No Activity For' TRUNC(maxidle/30+.5) 'minutes! -- Disconnecting.'CR
  5294. Send '\d'
  5295. CALL sound('TIMEOUT')
  5296. SIGNAL OUT
  5297.  
  5298. LOGOUT:
  5299. junk=getinput(1 1 pen3'Leave Feedback for SysOp? (Ny) > 'def)
  5300. IF junk='Y' THEN
  5301.   CALL editor(name maxtime-TRUNC(TIME('E')) 'MAIL' sysop . 0 0 'FEEDBACK')
  5302.  
  5303. LOGOUT2:
  5304. clr=''
  5305. CALL checkexternal()
  5306. SIGNAL OFF BREAK_E
  5307. CALL SETCLIP('BBS_level')
  5308. CALL callsleft()
  5309. secs=TIME('E')
  5310. mins=secs%60
  5311. secs=TRUNC(secs//60)
  5312. IF secs<10 THEN secs='0'secs
  5313. SAY CR
  5314. SAY 'Public  files   online: 'RIGHT(comma(files.0),9)||CR
  5315. SAY 'Public messages online: 'RIGHT(comma(grand),9)||CR
  5316. SAY CR
  5317. SAY 'Time used this call:' mins':'secs||CR
  5318. SAY 'Goodbye' name', thank you for calling' bbsname'.'CR
  5319. linesperpage=99
  5320. arg=bbspath'BBS_TEXT/GOODBYE'
  5321. IF EXISTS(arg) THEN
  5322.   DO
  5323.     CALL DELAY(14)
  5324.     CALL showtext(arg 0)
  5325.   END
  5326. SAY CR
  5327. IF bbsprefs.2 & ~terseflag THEN CALL doGrin()
  5328.  
  5329. OUT:
  5330. SIGNAL OFF BREAK_E
  5331. Remote OFF
  5332. data.18=winnings
  5333. line=left(name,16,' ') 'logged off at' time('C')
  5334. dcd
  5335. IF RC~=0 THEN Send '\ah'
  5336. IF data.20~='' THEN
  5337.   DO
  5338.     Status 'Y'
  5339.     elapsed=RESULT
  5340.     line=line 'Total:'elapsed
  5341.     PARSE VAR elapsed thour':'tmin':'.
  5342.     ADDRESS AREXX bbsHOURLY.rexx TIME('H') TIME('M')//60 thour tmin bbspath'Numbers/Hourly'
  5343.     PARSE VAR data.19 dhour 'hours' dmin 'minutes in' calls .
  5344.     IF ~DATATYPE(tmin,'W')  THEN tmin=0
  5345.     IF ~DATATYPE(thour,'W') THEN thour=0
  5346.     IF ~DATATYPE(dhour,'W') THEN dhour=0
  5347.     IF ~DATATYPE(dmin,'W')  THEN dmin=0
  5348.     IF ~DATATYPE(calls,'W') THEN calls=0
  5349.     IF thour=0 & tmin<3 THEN  /* free call if less than 3 minutes */
  5350.       DO
  5351.         wordloc=WORDINDEX(data.11,9)-1
  5352.         wordval=WORD(data.11,9)+1
  5353.         data.11=STRIP(LEFT(data.11,wordloc))
  5354.         data.11=data.11 wordval 'more calls today'
  5355.       END
  5356.     ELSE IF thour>0 | tmin>(maxtime/120) THEN /* over 50% mins used */
  5357.       CALL SETCLIP('BBS_FULLCALL',name TIME('M'))
  5358.     ufile=LEFT(DATE('S'),6)
  5359.     mmins=thour*60+tmin+countcheck('Usage/'ufile 0)
  5360.     CALL countcheck('Usage/'ufile mmins)
  5361.     mins=thour*60+tmin+countcheck('Numbers/Minutes' 0)
  5362.     CALL countcheck('Numbers/Minutes' mins)
  5363.     mins=thour*60+tmin+countcheck('Numbers/Minutes'bps 0)
  5364.     CALL countcheck('Numbers/Minutes'bps mins)
  5365.     cals=countcheck('Numbers/Calls' 0)+1
  5366.     CALL countcheck('Numbers/Calls' cals)
  5367.     cals=countcheck('Numbers/Calls'bps 0)+1
  5368.     CALL countcheck('Numbers/Calls'bps cals)
  5369.     thour=thour+dhour
  5370.     tmin=tmin+dmin+1
  5371.     IF tmin>59 THEN
  5372.       DO
  5373.         thour=thour+tmin%60
  5374.         tmin=tmin//60
  5375.       END
  5376.     data.19=thour 'hours' tmin 'minutes in' calls+1 'calls.'
  5377.     CALL SETCLIP('BBS_totalusage',mmins%60 mmins//60)
  5378.     CALL SETCLIP('BBS_userlogoff',TIME('C') DATE())
  5379.     CALL postuser(6)
  5380.     IF newfilesflag=1 THEN
  5381.       DO
  5382.         newfilesdate=DATE('S') TIME()
  5383.         lastbrowse=countcheck('Numbers/LastFile' 0)
  5384.       END
  5385.     IF clear_marked=1 THEN data.24=''
  5386.     CALL savedata(1)
  5387.     data.5=''
  5388.     IF EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') THEN
  5389.       DO
  5390.         IF sortalphaflag>0 | savefileflag>0 THEN
  5391.           CALL SETCLIP('BBS_QUICK_WAIT',1)
  5392.         ADDRESS AREXX bbsQUICKIN.rexx name level sysoplevel bbsprefs.6
  5393.       END
  5394.     arg=''
  5395.     lastline=RIGHT(TIME('C'),7) LEFT(DATE(),6)
  5396.     lastline=lastline'  'RIGHT(city,40)
  5397.     lastline=OVERLAY(name,lastline,16,LENGTH(name)+1) RIGHT(bps,5)
  5398.     lastline=lastline' Time:'elapsed
  5399.     newpassword=''
  5400.     IF data.20=0 THEN lastline=OVERLAY('UNVALIDATED_USER',lastline,16,38)
  5401.     CALL send2last(lastline)
  5402.     CALL bbsLOGOFF.baud(name level elapsed) 
  5403.     SAY lastline||def||CR
  5404.   END
  5405. CALL sound('LOGOFF')
  5406.  
  5407. OUT2:
  5408. CALL send2log(line)
  5409.  
  5410. DONE:
  5411. CALL send2log('')
  5412. logonflag=0
  5413. colorflag=1
  5414. CALL colors(1)
  5415.  
  5416. DONE2:
  5417. CBVflag=0
  5418. CALL setdir(libpath||dirs.1)
  5419. CALL SETCLIP('BBS_maxtime')
  5420. CALL SETCLIP('BBS_winnings')
  5421. CALL SETCLIP('BBS_minutes')
  5422. CALL SETCLIP('BBS_level')
  5423. CALL SETCLIP('BBS_door')
  5424. Capture
  5425. IF RC~=0 THEN Capture OFF
  5426. Send '\c\ah'
  5427. IF WORDS(bbsprefs.27)=8 THEN CALL dimBBcols()
  5428. ELSE IF bbsprefs.27=1 THEN CALL ScreenToBack('BAUD')
  5429. ELSE IF bbsprefs.27=2 THEN Screen OFF
  5430. ELSE CALL DELAY(14)
  5431. Remote OFF
  5432. baud maxbps
  5433. IF sortuserflag=0 & sortalphaflag=0 & savefileflag=0 & emailonline>=0 & buildalpha=0 THEN
  5434.   CALL DELAY(128)
  5435. ELSE
  5436.   DO
  5437.     CALL ATZreset()
  5438.     CALL DELAY(52)
  5439.     Send 'ATH1\r'
  5440.     CALL DELAY(128)
  5441.     Send 'ATH1\r'
  5442.     IF buildalpha~=0 THEN
  5443.       DO
  5444.         CALL BuildALPHA.rexx()
  5445.         sortalphaflag=0
  5446.         savefileflag=0
  5447.         buildalpha=0
  5448.       END
  5449.     IF sortuserflag=1 THEN
  5450.       DO
  5451.         CALL sortuserlist()
  5452.         IF SHOW('P','BBBBS_LOCAL') THEN
  5453.           DO
  5454.             CALL SETCLIP('BBS_localusers')
  5455.             CALL SETCLIP('BBS_mainusers',1)
  5456.           END
  5457.       END
  5458.     IF sortalphaflag>0 | savefileflag>0 | GETCLIP('BBS_resave')~='' THEN
  5459.       DO
  5460.         x=GETCLIP('BBS_resave')
  5461.         IF savefileflag>0 THEN CALL savefilelist2()
  5462.         ELSE IF x='' THEN CALL savealphalist()
  5463.         x=GETCLIP('BBS_resave')
  5464.         CALL SETCLIP('BBS_resave')
  5465.         IF x=1 THEN
  5466.           DO
  5467.             sortalphaflag=1
  5468.             savefileflag=1
  5469.             SIGNAL DONE2
  5470.           END
  5471.         IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  5472.         CALL SETCLIP('BBS_QUICK_WAIT')
  5473.       END
  5474.     IF emailonline<0 THEN CALL countmail()
  5475.   END
  5476. IF bbsprefs.15=0 THEN  /* quit or restart? */
  5477.   DO
  5478.     IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  5479.     CALL checkstats()
  5480.     EXIT
  5481.   END
  5482. IF STORAGE()<bbsprefs.15 THEN
  5483.   DO
  5484.     IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  5485.     SAY CR
  5486.     SAY '*** Unsafe memory level!'CR
  5487.     line='*** Less than' bbsprefs.15 'bytes available, BBBBS has been unloaded.'
  5488.     SAY line||CR
  5489.     SAY CR
  5490.     CALL send2log(line)
  5491.     EXIT
  5492.   END
  5493. CALL CLOSE(f)
  5494. CALL CLOSE(log)
  5495. bad_atz=ATZreset()   /* reset modem */
  5496. CALL zerovars()
  5497. DO FOREVER
  5498.   IF GETCLIP('BBS_QUIT')='QUIT' THEN
  5499.     DO
  5500.       CALL SETCLIP('BBS_QUIT')
  5501.       CALL SETCLIP('BBS_localfiles')
  5502.       CALL SETCLIP('BBS_localusers')
  5503.       Send '\c'
  5504.       IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  5505.       IF SHOW('P','BBSPOST') THEN ADDRESS 'BBSPOST' 'QUIT'
  5506.       EXIT
  5507.     END
  5508.   xstring=GETCLIP('BBS_RESET')
  5509.   IF xstring~='' THEN SIGNAL RESET
  5510.   xstring=GETCLIP('BBS_interpret')
  5511.   IF xstring~='' THEN
  5512.     DO
  5513.       CALL SETCLIP('BBS_interpret')
  5514.       INTERPRET xstring
  5515.       SIGNAL DONE2
  5516.     END
  5517.   IF GETCLIP('BBS_localfiles')>1 THEN
  5518.     DO
  5519.       CALL DELAY(150)
  5520.       Send 'ATH1\r'
  5521.       CALL SETCLIP('BBS_localfiles')
  5522.       CALL loadfiles()
  5523.       CALL loadalpha(1)
  5524.       SIGNAL DONE2
  5525.     END
  5526.   IF GETCLIP('BBS_localusers')~='' THEN
  5527.     DO
  5528.       CALL DELAY(150)
  5529.       Send 'ATH1\r'
  5530.       CALL SETCLIP('BBS_localusers')
  5531.       sortuserflag=1
  5532.       CALL sortuserlist()
  5533.       SIGNAL DONE2
  5534.     END
  5535.   IF GETCLIP('BBS_email')~='' THEN
  5536.     DO
  5537.       x=GETCLIP('BBS_email')
  5538.       CALL SETCLIP('BBS_email')
  5539.       IF DATATYPE(x,'W') THEN
  5540.         IF emailonline>-1 THEN emailonline=emailonline+x
  5541.     END
  5542.   IF bad_atz=1 THEN bad_atz=ATZreset()
  5543.   dcd
  5544.   IF RC~=0 THEN Send '\ah'
  5545.   IF GETCLIP('BBS_SLAVE')=1 THEN
  5546.     DO
  5547.       Quiet ON
  5548.       IF SHOW('P','BBS_SLAVE') THEN ADDRESS 'BBS_SLAVE' 'QUIT'
  5549.       cm=''
  5550.       t=WAITPKT('BBBBS')
  5551.       DO i=1
  5552.         p=GETPKT('BBBBS')
  5553.         IF p='0000 0000'x THEN LEAVE i
  5554.         cm=GETARG(p)
  5555.         t=REPLY(p,0)
  5556.       END
  5557.       Quiet OFF
  5558.       x=GETCLIP('BBS_SLAVE_RATE')
  5559.       CALL SETCLIP('BBS_SLAVE_RATE')
  5560.       IF cm='QUIT' THEN EXIT
  5561.       SAY 'CONNECT' x||CR
  5562.       SIGNAL LOGON
  5563.     END
  5564.   wres=''
  5565.   Wait 'RING'
  5566.   wres=RESULT
  5567.   IF wres='RING' THEN
  5568.     DO
  5569.       Send 'ATA\r'
  5570.       Timeout 45  /* wait 45 seconds for connect */
  5571.       wres=''
  5572.       Wait 'CONNECT,NO CARRIER,RING,+FCON,+FHNG'
  5573.       wres=RESULT
  5574.       CALL DELAY(28)
  5575.       IF wres~='CONNECT' THEN SIGNAL DONE2
  5576.       CALL DELAY(114)
  5577.       SAY ' 'CR
  5578.       CALL DELAY(28)
  5579.       SAY ' 'CR
  5580.       dcd
  5581.       IF RC=0 THEN
  5582.         DO
  5583.           CALL DELAY(128)
  5584.           dcd
  5585.           IF RC=0 THEN
  5586.             DO
  5587.               CALL DELAY(128)
  5588.               dcd
  5589.               IF RC=0 THEN SIGNAL DONE2
  5590.             END
  5591.         END
  5592.       CALL SETCLIP('BBS_interpret')
  5593.       CALL SETCLIP('BBS_MESSAGE')
  5594.       IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  5595.       ELSE IF bbsprefs.27=2 THEN Screen ON
  5596.       ELSE CALL DELAY(114)
  5597.       SAY ''CR    /* reset text defaults */
  5598.       SIGNAL LOGON
  5599.     END
  5600.   ELSE CALL checkstats()
  5601.   IF GETCLIP('BBS_resave')~='' THEN SIGNAL DONE2
  5602. END
  5603. EXIT
  5604.  
  5605.  
  5606. dimBBcols:
  5607. DO i=0 TO 7
  5608.   Send '\S'i'-'WORD('000 BA3 039 878 094 828 552 835',i+1)
  5609. END
  5610. RETURN
  5611.  
  5612.  
  5613. setBBcols:
  5614. DO i=0 TO 7
  5615.   Send '\S'i'-'WORD(bbsprefs.27,i+1)
  5616. END
  5617. RETURN
  5618.  
  5619.  
  5620. ATZreset:
  5621. TimeOut 10
  5622. Send 'ATZ\r'
  5623. Wait 'OK,RING'
  5624. IF RESULT~='OK' THEN
  5625.   DO
  5626.     Send '\d\wATZ\r'
  5627.     Wait 'OK'
  5628.     IF RESULT~='OK' THEN
  5629.       DO
  5630.         Send '\w\w+++\w\w\w\wATH\r'
  5631.         CALL sound('ATZ_FAIL')
  5632.         IF WORDS(bbsprefs.27)=8 THEN CALL setBBcols()
  5633.         ELSE IF bbsprefs.27=1 THEN CALL ScreenToFront('BAUD')
  5634.         ELSE IF bbsprefs.27=2 THEN Screen ON
  5635.         line='*** ATZ failed to reset!' TIME('C') DATE()
  5636.         SAY line'  Check your modem!!'CR
  5637.         CALL send2log(line)
  5638.         RETURN 1
  5639.       END
  5640.   END
  5641. TimeOut 45
  5642. Send '\dATH\r'
  5643. RETURN 0
  5644.  
  5645.  
  5646. getbaudrate: PROCEDURE
  5647. TRACE OFF
  5648. BaudRate
  5649. brate=RC
  5650. TRACE
  5651. RETURN brate
  5652.  
  5653.  
  5654. checkalias:
  5655. addressee=''
  5656. IF alias.0=0 THEN RETURN 0
  5657. DO i=1 TO alias.0
  5658.  IF UPPER(alias.i)=UPPER(string) THEN
  5659.   DO
  5660.    addressee=realname.i
  5661.    LEAVE i
  5662.   END
  5663. END
  5664. IF addressee='' THEN RETURN 0
  5665. string=''
  5666. SAY pen3'Email to 'def||addressee||CR
  5667. CALL editor(name maxtime-TRUNC(TIME('E')) 'MAIL' addressee . 0 0)
  5668. RETURN 0
  5669.  
  5670.  
  5671. upCBV:
  5672. ARG res .
  5673. temp=bbspath'Lists/CBV_USERS'
  5674. IF EXISTS(temp) THEN t2='A'
  5675. ELSE t2='W'
  5676. x=OPEN(f,temp,t2)
  5677. IF x=0 THEN RETURN 1
  5678. IF t2='W' THEN CALL WRITELN(f,'*** Call Back Verify Log ***')
  5679. temp=RIGHT(TIME('C'),7) COMPRESS(DATE())
  5680. temp=temp LEFT(name,24) RIGHT(telnum' RESULT:',20) res
  5681. CALL WRITELN(f,temp) 
  5682. CALL CLOSE(f)           
  5683. RETURN 0
  5684.  
  5685.  
  5686. CBV:
  5687. IF bbsprefs.22=0 THEN RETURN
  5688. SAY CR
  5689. CALL showtext(bbspath'BBS_TEXT/CBV_INFO' 1)
  5690. SAY CR
  5691. telnum=getinput(1 0 pen7'Please Enter Phone Number For Call Back: 'def )
  5692. mask=COMPRESS(XRANGE(),'0123456789-, @#*')
  5693. telnum=COMPRESS(telnum,mask)
  5694. IF telnum='' THEN RETURN
  5695. DO n=1 WHILE n<LENGTH(telnum) & ~DATATYPE(SUBSTR(telnum,n,1),'W')
  5696. END
  5697. IF SUBSTR(telnum,n,1)<2 THEN
  5698.   DO
  5699.     SAY 'No long distance numbers, please!'CR
  5700.     RETURN
  5701.   END
  5702. temp='The BBS will now call' telnum 'to verify. Correct? (Ny) > '
  5703. IF getinput(1 1 temp)~='Y' THEN RETURN
  5704. CALL sound('CBV')
  5705. telnum=COMPRESS(telnum)
  5706. data.27=STRIP(data.27 telnum)
  5707. SAY pen3'Logging Off. Callback to' telnum 'in 30 seconds.'def||CR
  5708. SAY 'When your modem rings, type  ATA  and press RETURN.'CR
  5709. SAY pen2'GoodBye for now,' name '.'def||CR
  5710. REMOTE OFF
  5711. Timeout 10
  5712. Send '\ah'
  5713. Wait 'OK,RING'
  5714. IF RESULT~='OK' THEN
  5715.   DO
  5716.     Send '\d'
  5717.     CALL DELAY(50)
  5718.     DO n=1 TO 10 WHILE ATZreset()=1
  5719.     END
  5720.   END
  5721. CALL DELAY(50)
  5722. Send 'ATH1\r'
  5723. SAY CR
  5724. CALL DELAY(99)
  5725. SAY CR
  5726. DO n=14 TO 1 BY -1
  5727.   MSG '1B'x'M' n*2 'seconds left before CBV callback...'
  5728.   CALL DELAY(99)
  5729. END
  5730. MSG lineup 'Beginning CBV callback...               '
  5731. SAY CR
  5732. Timeout 10
  5733. Send '\ah'
  5734. Wait 'OK'
  5735. IF RESULT~='OK' THEN
  5736.   DO
  5737.     Send '\d'
  5738.     CALL DELAY(50)
  5739.     DO n=1 TO 10 WHILE ATZreset()=1
  5740.     END
  5741.   END
  5742. CALL DELAY(50)
  5743. Send 'ATL3M1DT'telnum'\r'  /* M1 = Speaker ON, L3 = volume up */
  5744. Timeout 90
  5745. Wait 'CONNECT,NO CARRIER,BUSY,ERROR'
  5746. IF RESULT~='CONNECT' THEN 
  5747.   DO
  5748.     CALL upCBV('FAILED')
  5749.     SIGNAL OUT
  5750.   END
  5751. REMOTE ON
  5752. DO i=20 TO 0 BY -1
  5753.   SAY CENTER(copyright.i,75)||CR
  5754. END
  5755. SAY CENTER(bbsname 'Call Back Identity Verification',74)||CR
  5756. SAY CR
  5757. CBVflag=1
  5758. Timeout maxidle
  5759. DO cnt=1 TO 3
  5760.   Namentr=getinput(1 0 pen3'    Enter Name: 'def)
  5761.   Namentr=cleanstring('1:'Namentr)
  5762.   IF Namentr=name THEN LEAVE cnt
  5763. END
  5764. DO count=1 TO 4
  5765.   IF cnt>3 | count>3 THEN
  5766.     DO
  5767.       SAY 'Incorrect Entry!'||CR
  5768.       SAY 'Verification Denied.'||CR
  5769.       SAY pen2'Leave a 'pen3'['pen7'C'pen3']omment'pen2'to SysOp,'CR
  5770.       SAY pen2'for manual verification.'CR
  5771.       SAY CR
  5772.       CALL upCBV('DENIED')
  5773.       SIGNAL OUT
  5774.     END
  5775.   pw=getinput(1 0 pen3'Enter Password: 'def)
  5776.   IF UPPER(pw)=data.5 THEN
  5777.     DO
  5778.       CALL upCBV('VERIFIED')
  5779.       v=GETCLIP('BBS_COMMAND')
  5780.       CALL SETCLIP('BBS_COMMAND',v'V')
  5781.       CBVflag=0
  5782.       RETURN
  5783.     END
  5784. END
  5785. RETURN
  5786.  
  5787.  
  5788. /* BBBBS.baud */
  5789.